2015年12月13日

EntityFramework(23): IValidatableObjectによる検証

  
これまで見てきたデータ検証は、一つのフィールドに対しての検証でしたが、 IValidatableObjectインターフェースを実装することにより、 複数のフィールドに対する検証を行うこともできます。
以下の例は、Customerクラスに、IValidatableObject を実装した例です。

public partial class Customer : IValidatableObject {
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        if (!string.IsNullOrWhiteSpace(ContactTitle) && string.IsNullOrWhiteSpace(ContactName) ) {
            var msg = "ContactTitleに値が設定されている時は、ContactNameにも値を設定する必要があります。";
            var members = new[] { "ContactName" }; 
            yield return new ValidationResult(msg,members);

        }
    }
}

自動生成されたEntityクラスに追加するのではなく、別途 Partialクラスを定義しています。
この検証が正しく動作するかを確認するコードも書いてみます。

using (var db = new NorthwindContext()) {
    try {
        Customer cust = new Customer {
            CustomerID = "CSFM",
            CompanyName = "CSharp Food Market",
            ContactTitle = "Manager"
        };
        db.Customers.Add(cust);
        db.SaveChanges();
    } catch (DbEntityValidationException ex) {
        PrintEntityValidationErrors(ex.EntityValidationErrors);
    }
}

デバッグ実行すると、SaveChangesメソッド呼び出し時に、Validateメソッドが走り、 検証が行われているのが確認できます。
 


 

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

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