エンティティフレームワーク-検証

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

  • Entity Frameworkでは、データ検証はアプリケーションで不良データをキャッチするためのソリューションの一部です。

  • Entity Frameworkは、さまざまなデータ検証方法を使用して、デフォルトでデータベースに書き込まれる前にすべてのデータを検証します。

  • ただし、Entity Frameworkは、ユーザーインターフェイスのデータ検証の後に提供されます。したがって、その場合、EFがスローする例外を処理し、一般的なメッセージを表示するためのエンティティ検証が必要です。

  • エラーチェックを改善するためのデータ検証の手法と、エラーメッセージをユーザーに返す方法がいくつかあります。

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

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

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