DbEntityValidationResult和ValidationResult之间有什么关系?

时间:2014-06-13 13:42:58

标签: c# .net entity-framework validation

有人可以解释System.Data.Entity.Validation.DbEntityValidationResultSystem.ComponentModel.DataAnnotations.ValidationResult类之间的关系吗?

IValidatableObject正在处理可用于验证使用数据注释的对象的ValidationResult个对象。同时,使用Entity Framework DataContext存储对象时,DbEntityValidationResult个对象用于报告验证错误。所以我想知道两者之间的确切关系。是否仅在实际与数据库交互时使用DbEntityValidationResult个对象?

EF是内部使用的ComponentModel验证还是完全独立的两个验证,除了它们都依赖于数据注释?

1 个答案:

答案 0 :(得分:2)

System.ComponentModel.DataAnnotations.ValidationResult - 用于使用数据注释的对象。 ValidationResult类包含一个属性,该属性包含错误适用的属性名称。

基本上,实体框架在其自己的方法中使用System.ComponentModel进行验证。

System.Data.Entity.Validation.DbEntityValidationResult - 仅由实体框架使用。 DbValidationError 包含整个验证对象的一个​​属性的错误。

DbEntityValidationResult实际上是 EntityFramework程序集的一部分

当实体框架在将Validation转换为ValidatableObjectValidator时验证数据(在IEnumerable<DataAnnotaion.ValidationResult>类的IEnumerable<DbValidationError>方法中发生):

foreach (var validationResult in validationResults)
{
    if (validationResult == null)
    {
        continue;
    }
    // let's treat null or empty .MemberNames the same way as one undefined (null) memberName
    var memberNames = validationResult.MemberNames == null || !validationResult.MemberNames.Any()
                            ? new string[] { null }
                            : validationResult.MemberNames;

    foreach (var memberName in memberNames)
    {
        yield return new DbValidationError(memberName ?? propertyName, validationResult.ErrorMessage);
    }
}

因此,ValidationResult.MemberNames中的每个名称都会创建一个DbValidationError(对于特殊情况,例如null或空.MemberNames或.MemberNames中的空名称,会有一些例外)

与来源的链接:

ValidatableObjectValidator.cs

DbHelpers.cs