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