Может ли кто-нибудь объяснить взаимосвязь между классами System.Data.Entity.Validation.DbEntityValidationResult
и System.ComponentModel.DataAnnotations.ValidationResult
?
Объект IValidatableObject
имеет дело с объектами ValidationResult
которые могут использоваться для проверки объекта, использующего аннотации данных. В то же время при использовании объекта DataContext Entity Framework для хранения объекта объекты DbEntityValidationResult
используются для сообщения ошибок проверки. Поэтому я задаюсь вопросом о точной взаимосвязи между ними. Объекты DbEntityValidationResult
используются только при фактическом взаимодействии с базой данных?
И является ли проверка ComponentModel
используемая EF внутренне, или две полностью независимые, за исключением того, что они оба полагаются на Data Annotations?
System.ComponentModel.DataAnnotations.ValidationResult
- используется для объектов, которые используют аннотации данных. Класс ValidationResult
содержит свойство с именами свойств, к которым применяется ошибка.
В основном инфраструктура Entity использует System.ComponentModel
для проверки внутри своих собственных методов.
System.Data.Entity.Validation.DbEntityValidationResult
- используется только Entity Framework. DbValidationError содержит ошибку для одного свойства всего проверяемого объекта.
DbEntityValidationResult
на самом деле является частью сборки EntityFramework.
Когда Entity Framework проверки данных (что происходит в Validation
метода ValidatableObjectValidator
класса) в преобразования IEnumerable<DataAnnotaion.ValidationResult>
в IEnumerable<DbValidationError>
:
foreach (var validationResult in validationResults)
{
if (validationResult == null)
{
continue;
}
// let 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 или empty.MemberNames или пустые имена в.MemberNames)
Ссылки на источники: