Entity-framework-validation

提供:Dev Guides
移動先:案内検索

Entity Framework-検証

この章では、モデルデータを検証するためにADO.NET Entity Frameworkで使用できる検証手法について学習します。 Entity Frameworkは、クライアント側の検証用のユーザーインターフェイスに実装したり、サーバー側の検証に使用したりできる、さまざまな検証機能を提供します。

  • Entity Frameworkでは、データ検証はアプリケーション内の不良データをキャッチするためのソリューションの一部です。
  • Entity Frameworkは、さまざまなデータ検証方法を使用して、デフォルトでデータベースに書き込まれる前にすべてのデータを検証します。
  • ただし、Entity Frameworkはユーザーインターフェイスのデータ検証の後に来ます。 そのため、その場合は、EFがスローしてすべての例外を処理し、一般的なメッセージを表示するエンティティ検証が必要です。
  • エラーチェックとエラーメッセージをユーザーに戻す方法を改善するためのデータ検証の手法がいくつかあります。

DbContextには、ValidateEntityと呼ばれるオーバーライド可能なメソッドがあります。 SaveChangesを呼び出すと、Entity Frameworkは、状態がUnchangedでないキャッシュ内の各エンティティに対してこのメ​​ソッドを呼び出します。 学生エンティティの次の例に示すように、ここに検証ロジックを直接配置できます。

public partial class UniContextEntities : DbContext {

   protected override System.Data.Entity.Validation
      .DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry,
      System.Collections.Generic.IDictionary<object, object> items) {

         if (entityEntry.Entity is Student) {

            if (entityEntry.CurrentValues.GetValue<string>("FirstMidName") == "") {

               var list = new List<System.Data.Entity
                  .Validation.DbValidationError>();

               list.Add(new System.Data.Entity.Validation
                  .DbValidationError("FirstMidName", "FirstMidName is required"));

               return new System.Data.Entity.Validation
                  .DbEntityValidationResult(entityEntry, list);
            }
         }

         if (entityEntry.CurrentValues.GetValue<string>("LastName") == "") {

            var list = new List<System.Data.Entity
               .Validation.DbValidationError>();

            list.Add(new System.Data.Entity.Validation
               .DbValidationError("LastName", "LastName is required"));

            return new System.Data.Entity.Validation
               .DbEntityValidationResult(entityEntry, list);
         }

         return base.ValidateEntity(entityEntry, items);
   }
}

上記のValidateEntityメソッドでは、いずれかのプロパティに空の文字列がある場合、StudentエンティティのFirstMidNameプロパティとLastNameプロパティがチェックされ、エラーメッセージが返されます。

次のコードに示すように、新しい生徒が作成されたが、生徒のFirstMidNameが空の文字列である簡単な例を見てみましょう。

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         Console.WriteLine("Adding new Student to the database");
         Console.WriteLine();

         try {

            context.Students.Add(new Student() {
               FirstMidName = "",
               LastName = "Upston"
            });

            context.SaveChanges();
         } catch (DbEntityValidationException dbValidationEx) {

            foreach (DbEntityValidationResult entityErr in
               dbValidationEx.EntityValidationErrors) {

               foreach (DbValidationError error in entityErr.ValidationErrors) {
                  Console.WriteLine("Error: {0}",error.ErrorMessage);
               }
            }
         }

         Console.ReadKey();
      }
   }
}

上記の例をコンパイルして実行すると、コンソールウィンドウに次のエラーメッセージが表示されます。

Adding new Student to the database
Error: FirstMidName is required

理解を深めるために、上記の例を段階的に実行することをお勧めします。