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
理解を深めるために、上記の例を段階的に実行することをお勧めします。