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

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

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

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

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

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

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

Я видел это из другого сообщения в stackoverflow http://automapper.codeplex.com/ ... не уверен если это поможет или это лучшее решение.


person Chris Klepeis    schedule 04.06.2010    source источник


Ответы (2)


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

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

person Eric J.    schedule 04.06.2010
comment
Я всегда учусь новому ... если это хорошее решение, я выучу его, но меня беспокоит, повлияют ли эти аннотации на другие области программы, которые в них не нуждаются. - person Chris Klepeis; 04.06.2010
comment
@Chris: Аннотации не должны влиять на другие части программы. Это просто атрибуты (метаданные, прикрепленные к классу / методу / и т. Д.), Которые программа может при желании прочитать. Единственное исключение, о котором я могу думать, - это если вы нацеливаетесь на ограниченную среду выполнения (например, Silverlight CLR), в которой отсутствуют некоторые методы. В этом случае вы можете использовать #if !SILVERLIGHT, чтобы скрыть эти атрибуты от Silverlight. - person Eric J.; 05.06.2010

Если ваш класс 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
    }
}

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

person Jon    schedule 04.06.2010
comment
Должны ли эти частичные классы находиться в моей папке Models на уровне пользовательского интерфейса, или я могу ссылаться на них со своего уровня Entities? - person Chris Klepeis; 05.06.2010
comment
@Chris: это элегантное решение для добавления пользовательских метаданных. Если вам нужно повлиять на тело метода, как это сделал я, это не сработает (мне пришлось добавить NotifyPropertyChange). - person Eric J.; 05.06.2010