Потеря DataAnnotations при использовании POCO Entity Framework 4 - PullRequest
2 голосов
/ 14 ноября 2011

Я использую новую EntityFramework 4.1 с объектами POCO в сочетании с платформой DataAnnotation.

Когда EntityFramework необходимо создать прокси-класс (например, ленивая загрузка виртуальных свойств), все мои аннотации данных теряются. Есть ли какой-нибудь способ, которым мой ModelMetaData может прийти из класса, который был прокси, вместо класса прокси?

Я знаю, что у меня есть возможность отключить создание прокси (context.Configuration.ProxyCreationEnabled), но это кажется плохим ответом. Я думаю, это должно быть решено.

Вот пример кода:

public class Person
{
    [Required, Display(Name = "Display That Name")]
    public string DisplayName { get; set; }
}

А затем в моих метаданных модели в представлении тип: Person_9C92B92D56F6F4F0FB1686526D585438A05323CC72E457C2152796E8866297E1 (FullName = "System.Data.Entity.DynamicProxies.Person_9C92B92D56F6F4F0FB1686526D585438A05323CC72E457C2152796E8866297E1"}), мои метаданные исчезли, и отображаемое имя отображается в «DisplayName», а не «Display That Name».

Есть предложения?

Ответы [ 3 ]

6 голосов
/ 05 декабря 2011

Вы можете сделать версию метаданных для ваших моделей классов. Мы делаем это таким образом ... то, что генерирует EF, никогда не затрагивается вручную.

Пусть сказали, что у вас есть класс Person:

public partial class Person
{
        public int idPerson { get; set; }
        public int idTenant { get; set; }
        public string Name { get; set; }
}

Тогда вы можете создать класс Metadata, который содержит метаданные и не будет переопределен:

[MetadataType(typeof(PersonMD))]
    public partial class Person
    {
       //leave it empty
    }

    public partial class PersonMD
    {
       [Required]
       public int idPerson { get; set; }

       [Required]
       public int idTenant { get; set; }

       [Required, Display(Name = "Display That Name")]
       public string Name { get; set; }
    }
1 голос
/ 15 ноября 2011

Что мы делаем следующим образом:

Изменим шаблоны T4 для генерации частичных классов для ваших сущностей.

Для тех сущностей, к которым вы хотите добавить аннотации, создайте частичный классто же имя вашей сущности.

Создайте класс собеседников в этом классе, который предоставит ваши аннотации.

Примените атрибут в верхней части частичного класса, чтобы указать, где находится ваш класс собеседников.подробности аннотации можно найти.

Подробнее см. здесь http://msdn.microsoft.com/en-us/library/ee256141.aspx

0 голосов
/ 14 ноября 2011

Я выяснил одно возможное решение. Не уверен, что есть лучшие. Сначала я написал новый ModelMetadataProvider:

public class IgnoreProxiesDataAnnotationsModelMetadataProvider : System.Web.Mvc.DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        modelType = ObjectContext.GetObjectType(modelType);
        containerType = ObjectContext.GetObjectType(containerType);

        return base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
    }
}

А потом зарегистрировал его в запуске приложения Global.asax:

ModelMetadataProviders.Current = new IgnoreProxiesDataAnnotationsModelMetadataProvider();

Если есть лучшее решение, пожалуйста, дайте мне знать!

...