2017-03-03 8 views
1

コンテキストを保存する前に検証エラーをチェックしたいと思います。 私はcontext.GetValidationErrors()を呼び出していますが、これは空です。次にcontext.SaveChanges()を呼び出すと、私のユニークなインデックスの重複行のエラーが出ます。Entity Framework GetValidationErrorsがユニークインデックスのために空です

using(var context = new DefaultDbContext()) 
{ 
    var user = new User() 
    { 
     OSIdentity = "test" 
    }; 
    var duplicateUser = new User() 
    { 
     OSIdentity = "test" 
    }; 
    context.Users.Add(user); 
    context.Users.Add(duplicateUser);  
    // this is empty 
    var errors = context.GetValidationErrors(); 
    if(errors.Count == 0) 
    { 
     // this throws the exception for duplicate row for unique index "Idx_UserOSIdentity" 
     context.SaveChanges(); 
    } 
} 

マイユーザエンティティは、次の列があります。

[Index("idx_UserOSIdentity", IsUnique = true)] 
[Display(Name = "OSIdentity")] 
[Required(AllowEmptyStrings = false, ErrorMessage = "...")] 
[StringLength(450, ErrorMessage = "...")] 
public string OSIdentity { get; set; } 

はなぜユニークインデックスがcontext.GetValidationErrors()が呼び出されたときにチェックされていないが、しかしcontext.SaveChangesに、その後スローされますか()?

答えて

2

これは、EFアーキテクチャごとに予想される動作です。

EFには4種類のデータ検証があります。

Data Annotations:は主にlengthemail formatなどのようなUIのエラーチェックのために、IndexAttributeが検証属性ではありません、それはまた、ErrorMessage性質を持っていない、それはまたに使用されているIsValid()メソッドを持っていません有効な値の範囲に対してこれを検証します。これがgetValidationErrorsが一意性をチェックしていない理由です。

IValidatableObject:データ注釈

ValidateEntityでは達成できないよりも、より複雑なチェックを行うための「検証」メソッドを追加することで、よりカスタムチェックのためのフック、:のためのデータベース へのアクセスを可能にしますDbContext方法検証を行っています。私の意見では、ここでは、保存する前に一意性をチェックする独自のロジックを書くことができます。

DbUpdateException一意失敗のあなたのケースのように、データベースの整合性の障害の場合にはEFのSaveChanges()またはSaveChangesAsync()後、EFは、当社のデータベースの上で動作し、データベースは、独自のデータの整合性を持っている、database-generated errorsをキャプチャ、その後インクルードがあるコミットロールバックされ、エラーは例外を介して返されます。

データベースのデータ整合性の例外をどこで捕捉/処理したいのですか。

+0

[Index]フラグはSystem.ComponentModel.DataAnnotations名前空間にありますが、なぜ他のデータ注釈でチェックされていませんか? – Tony

+1

IndexAttributeは検証属性ではなく、ErrorMessageプロパティもなく、有効な値の範囲に対して検証するために使用されるIsValid()メソッドもありません。 – Anil

+0

ありがとう、私は今理解しています。だから私はインデックスの属性は、コンテキストにエンティティを追加する前に重複をチェックすることをお勧めします。 – Tony

関連する問題