UPD
Решение здесь.
Перед проверкой необходимо вручную зарегистрировать класс метаданных
==================
Я полагаю, что эта проблема связана с прокси-классами, которые EF генерирует для ваших сущностей. Вы можете легко проверить это во время выполнения: просто посмотрите GetType (). FullName.
Если атрибут помечен как не наследуемый, он не будет применяться в унаследованном классе. А прокси-классы являются производными от классов сущностей, поэтому не наследуемые атрибуты теряются.
Я пытаюсь использовать DataAnnotations в проекте WebForms, проверяя атрибуты вручную. Но ни
System.ComponentModel.DataAnnotations.Validator.TryValidateObject(entity, new ValidationContext(value, null, null), results, true);
ни
PropertyInfo[] properties = value.GetType()
.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
var validationProperties = properties.Select(prop => new
{
Property = prop,
ValidationAttributes = Attribute.GetCustomAttributes(prop, typeof(ValidationAttribute), true)
}).Where(valProp => valProp.ValidationAttributes.Any());
не работает.
Я пробовал этот код с простым классом, не связанным с EF, и все атрибуты DataAnnotations были найдены и проверены правильно.
[MetadataType(typeof(TestValidObject_Metadata))]
public class TestValidObject
{
public string IdName { get; set; }
}
public class TestValidObject_Metadata
{
[Required, DisplayName("Id name")]
public object IdName { get; set; }
}
Определение обязательного атрибута:
[AttributeUsageAttribute(AttributeTargets.Property|AttributeTargets.Field|AttributeTargets.Parameter, AllowMultiple = false)]
public class RequiredAttribute : ValidationAttribute
и по умолчанию он становится наследуемым атрибутом. И я не знаю, почему
Attribute.GetCustomAttributes(prop, typeof(ValidationAttribute), true)
// true specifies to also search the ancestors of element for custom attributes.
не ловит его.
Любые идеи приветствуются.