Определение аннотации данных с использованием DbContext против Objectcontext в подходе базы данных в первую очередь - PullRequest
3 голосов
/ 31 января 2012

Я использую первый подход к базе данных с структурой сущностей, когда я работал над шаблоном по умолчанию, таблицы базы данных отображались с использованием ObjectContext, поэтому я использовал для создания #partial классы & [MetadataType (typeof) для применения данныханнотации ,, но когда я начинаю использовать шаблон генерации кода Dbcontext для сопоставления таблиц базы данных, я обнаружил, что он создаст папку .tt в моей области Model, где я обнаружил, что я могу применить аннотацию данных непосредственно к классам .csсами по себе без необходимости создавать частичные классы, как в случае objectcontext .В настоящее время аннотации данных работают нормально, , но может ли мой подход вызвать у меня проблемы, о которых я не знаю, и мне следует создавать частичные классы, как я это делал с Objectcontext ?BR

Ответы [ 3 ]

6 голосов
/ 31 января 2012

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

Лучшей практикой для вашей ситуации будет создание нового файла в вашем решении с другим объявлением частичного класса.В этом файле добавьте атрибут MetadataType в класс и добавьте свои атрибуты проверки на уровне свойств в класс «собеседника» (тот, на который есть ссылка в атрибуте).Это позволяет вам использовать атрибуты проверки в сгенерированных свойствах, и, если ваша модель / база данных изменится, вы все равно сможете заново сгенерировать классы модели, не теряя их.

Например, ваш новый файл может выглядеть примерно так:

[MetadataType(typeof(PersonMetadata))]
partial class Person
{
    // Add logic to the generated class in here.

    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
}

class PersonMetadata
{
    // Add attributes to the generated properties in here.

    [Required]
    public string FirstName { get; set; }
}
0 голосов
/ 31 января 2012

Мое понимание вашей ситуации заключается в том, что вы изменили свой стиль Database-First на стиль Code-First.Если ваш контекстный класс унаследован от DbContext, вы находитесь в стиле Code-First (если только не существует какой-то странной гибридной возможности, о которой я не знаю!).

В Code-First действительно нетточка создания частичных классов для аннотаций данных, IMO.

0 голосов
/ 31 января 2012

Создайте те же частичные классы для определения ваших метаданных ИЛИ вы можете просто перепроектировать вашу существующую базу данных с помощью Entity Framework Power Tools, чтобы у вас были классы POCO. Затем вы можете использовать свободный API (вы увидите проверки, которые он добавляет для вас) вместо аннотаций данных для проверки на стороне сервера.

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

однако - я бы порекомендовал вам создать ViewModels и использовать AutoMapper для отображения между вашими объектами EF и viewmodels. Затем вы можете применить свои аннотации непосредственно к вашим ViewModels.

...