Использование классов EF POCO в качестве моделей MVC 2 (с аннотациями данных)

У меня есть четырехслойное веб-приложение, запрограммированное на C#....Net 4.0:

  • UI Layer
  • Бизнес уровень
  • Уровень доступа к данным
  • Слой сущностей

Мой слой данных содержит слой edmx Мои сущности содержит мои объекты POCO (сгенерированные скриптом t4), и на этот слой ссылаются все остальные слои.

При создании формы MVC для создания нового клиента, например.... У меня уже есть класс клиента с полями для имени, фамилии и т. Д. В моем слое сущностей, но этот автоматически сгенерированный класс POCO не имеет аннотаций данных для проверки... IE [обязательно] и т. д. для отправки формы

Мое решение сейчас состоит в том, чтобы создать новые классы моделей, которые в значительной степени совпадают с моими классами poco, но также имеют эти дополнительные аннотации проверки.

Я хочу знать, есть ли простой способ использования определенных объектов POCO в модели MVC (на уровне пользовательского интерфейса) без необходимости почти переписывать класс... а также без изменения t4, который генерирует эти классы POCO (так как я не до скорости на т4).

Я видел это из другого поста на stackru http://automapper.codeplex.com/... не уверен, будет ли это делать или это лучшее решение.

2 ответа

Решение

Модификация шаблона T4 совсем не сложна. Недавно я столкнулся с той же проблемой и решил немного почитать о T4, а затем изменить шаблон, чтобы создать сгенерированные свойства так, как они мне нужны (аннотации, в моем случае NotifyPropertyChange и т. Д., Поскольку я использую те же объекты POCO в Пользовательский интерфейс MVC и пользовательский интерфейс Silverlight).

Даже если вы ищете решение, которое не требует модификации T4, я надеюсь, что это полезно.

Если ваш класс POCO объявлен как таковой:

public class Person {
    public string FirstName { get; set; }
    public string LastName  { get; set; }
}

затем, если вы просто измените T4, чтобы сделать его частичным классом, вы можете определить его в отдельном файле:

[MetadataType(typeof(PersonMetadata))]
public partial class Person {

    internal class PersonMetadata {

        [Required]
        // insert other metadata here
        public string FirstName { get; set; }

        // and if you don't want metadata for lastname, you can leave it out
    }
}

Два дополнительных пункта - класс метаданных не должен быть вложенным в определенную вами часть, хотя я думаю, что он точнее. Кроме того, типы не должны совпадать в классе метаданных, так что вы можете сделать их объектными, если хотите (и вы можете увидеть некоторые примеры в Интернете с этим, вот так)

Другие вопросы по тегам