Dataannotation с EF - PullRequest
       19

Dataannotation с EF

0 голосов
/ 08 апреля 2011

Я попробовал DataAnnotation, как описано здесь , но у меня это не работает.

У меня есть таблица со следующей структурой

Table - Category
    id int (pk not null)
    CategoryName varchar(100) (null)

Я уже создал свой файл edmx и все.

Я создал файл Category.cs, как показано ниже.

[MetadataType(typeof(CategoryMetaData))]
public partial class Category
{
}

public class CategoryMetaData
{
    [Required(ErrorMessage = "Category Name is required.")]
    public object CategoryName;
}

Но мои проверки не работают.

Что я пропустил?

Ответы [ 3 ]

2 голосов
/ 07 ноября 2012

Я обнаружил, что ObjectContext не работает с аннотациями данных. Вы должны перейти на использование DbContext, тогда он работает. Загрузите файл EF 4.x DbContext T4 и попробуйте его на вашей модели. Не уверен, почему это так, надеялся, что эксперт вмешается.

0 голосов
/ 10 апреля 2011

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.

не ловит его.

Любые идеи приветствуются.

0 голосов
/ 08 апреля 2011

CategoryName в CateogryMetaData должно быть свойством и иметь тот же тип, что и исходное свойство.Попробуйте это:

public class CategoryMetaData
{
    [Required(ErrorMessage = "Category Name is required.")]
    public string CategoryName {get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...