Как совместно использовать DataAnnotations между классами EF CodeFirst Poco и классами ViewModel в MVC? - PullRequest
2 голосов
/ 13 февраля 2011

Я использую EF-CodeFirst для создания базы данных из моих объектов Poco и их конфигурации.Я интенсивно использовал Dataannotation (Required, DataLength, RegularExpression, DataType) для получения метаданных в MVC и получения сообщений об ошибках, указывающих на ресурс для их последующей локализации.

Для простых операций CRUD это не проблема.

Но как только мне понадобятся классы ViewModel, я теряю Dataannotations из моих объектов Poco.

Как можно объединить эти 2 дизайна, не нанося вред принципу СУХОЙ (не повторяйся)?

Спасибо, Андреас

Ответы [ 2 ]

4 голосов
/ 13 февраля 2011

Эти два дизайна не могут и не должны сочетаться.Ваши модели представлений привязаны к представлениям, поэтому лично я переопределяю все необходимые атрибуты в своих моделях представлений и верю этому или нет, но в данном случае меня не волнует DRY.Я делаю это потому, что требования моих взглядов меняются довольно часто (да, клиенты капризны), тогда как я всегда использую одни и те же доменные модели.Для меня мнение никогда не должно знать о существовании доменной модели.Представление должно быть фиктивным, и все, о чем оно должно знать, - это модель представления, которую ему передает контроллер.

Я знаю, что есть люди, которые могут думать иначе, и я уважаю их мнение.Таким образом, говоря об этом, я лишь раскрываю свою личную точку зрения и свой способ работы с ASP.NET MVC.И, честно говоря, мои модели - это объекты POCO без DataAnnotations, поэтому я не сталкиваюсь с такими проблемами.Я использую DataAnnotations в моих моделях представления только для целей форматирования (например, DataType, DisplayName и DisplayFormat) и без атрибутов проверки.Я использую FluentValidation.NET для этой цели.

2 голосов
/ 04 мая 2011

Вы можете довольно легко выполнить то, что вы просите.У Дарина есть очень верное замечание, которое хорошо подходит для крупных проектов, но я думаю, что для небольших проектов это звучит как излишнее.Также кажется, что это во многом зависит от того, используете ли вы DataAnnotations для проверки или используете стороннюю библиотеку.ИМХО, из-за того, что повторение не выполнялось, создавало неудобства при обслуживании.Существует также тот факт, что вы тратите много строк кода, просто копируя данные из БД в модель представления;Предполагается, что ORM помогут устранить это, но пока решение выглядит не очень хорошим.

Вот пример кода о том, как делать то, что вы хотите.Первый класс частичный, основная часть находится в сгенерированном EF-коде (сначала я собираюсь модель, а не код).Также, в качестве примера, у Вопроса есть FK to QuestionGroup.В БД это столбец с именем GroupID, но во ViewModel есть свойство с именем GroupName для отображения в симпатичной маленькой сетке (фактически, Telerik Grid, которая в основном ломается, если вы пытаетесь передать объект EF).

[MetadataType(typeof(QuestionMetadata))]
public partial class Question
{
}

public class QuestionMetadata
{
    public Int32 ID { get; set; }

    [Required]
    [Display(Name="Question")]
    public String QuestionText { get; set; }

    [Display(Name = "Order")]
    public Int16 SortOrder { get; set; }
}

[MetadataType(typeof(QuestionMetadata))]
public class QuestionViewModel
{
    /* Fields found in the original model */

    public Int32 ID { get; set; }

    public String QuestionText { get; set; }

    public Int16 SortOrder { get; set; }

    /* Fields that map child object data for this view model */

    [Display(Name = "Question Group")]
    public String GroupName { get; set; }
}

ИМХО и EF, и Telerik заставляют меня не быть СУХОЙ здесь, но я ничего не могу поделать.EF должен генерировать эти DataAnnotations по умолчанию (или, по крайней мере, иметь опцию), поскольку он, очевидно, знает, какие поля являются обязательными (не нулевыми) или какова максимальная длина различных строк.Затем Telerik заставляет меня создать ViewModel, что также болезненно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...