2015年12月09日

EntityFramework(22):独自の検証用属性を定義する

  
EntityFrameworkの検証機能の続きです。

標準で用意されている検証用属性では不足している場合は、ValidationAttribute を継承したクラスを定義する ことで、独自の検証用属性を定義することもできます。

以下、そのサンプルを示します。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
 public sealed class HiraganaAttribute : ValidationAttribute {
     private static Regex _regex = new Regex(@"^[\p{IsHiragana}\u30FC]+$");

     public override bool IsValid(object value) {
         if (value == null) {
             return true;
         }

         string valueAsString = value as string;
         if (valueAsString != null) {
             var m = _regex.Match(valueAsString);
             return m.Success;
         } else {
             return true;
         }
     }

     public override string FormatErrorMessage(string name) {
         return $"{name}はひらがなを指定してください";
     }
 }

このサンプルは、ひらがなと長音記号だけで成り立つ文字列の時だけ、検証を成功させます。 プロパティに以下のようにHiraganaAttribute を付加するだけです。

[Hiragana]
public string KanaName { get; set; }

なお、自動生成されたEntityクラスに手を入れたくないという場合は、 「楽観的同時実行制御 (Timestamp列なし)」で示した、MetadataType属性を付加したPartial クラスを定義することで、対応できます。

[MetadataType(typeof(Category.Metadata))]
public partial class Category {
    class Metadata {
        [ConcurrencyCheck]
        public string CategoryName { get; set; }

        [ConcurrencyCheck]
        [Hiragana]
        public string Description { get; set; }

        [ConcurrencyCheck]
        public byte[] Picture { get; set; }
    }
}

これは、DescriptionプロパティににHiragana属性を付加した例です。
実際に、Descriptionの値がひらがなだけというのは、UI的にどうかを思いますが... まあ例ということでお許しを。
 


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52443621