2012-01-30 2 views
3

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

ответ

6

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

Лучшей практикой для вашей ситуации было бы создать новый файл в вашем решении с другим объявлением частичного класса. В этом файле добавьте атрибут 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

Точка будет действительна, если я использую ObjectContext, так как этот шаблон будет создавать классы моделей, а не частичные классы, как в случае с шаблоном DbContext. Поэтому в шаблоне DBContext, если я хочу добавить какие-либо вспомогательные методы, я должен делать это в автоматически сгенерированных частичных классах, поскольку я не могу добавлять вспомогательные методы в класс метаданных, поэтому таким образом вспомогательный метод добавляется к автоматически сгенерированному коду, и это означает я потеряю его, если я регенерирую код. Любые предложения.BR –

+0

«MetadataType» используется только для добавления атрибутов уже объявленных свойств (поскольку частичные свойства невозможны). Вся другая вспомогательная логика может быть добавлена ​​непосредственно в класс через часть неполного файла частичного класса. – bricelam

+0

Я думаю, что все частичные классы в папке .tt будут удалены и повторно созданы, я могу восстановить код, я не знаю, что вы подразумеваете под «частью негенерированного файла частичного класса». ,, can объясните это. BR –

0

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

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

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

+0

на самом деле то, что я заметил, что классы из папки .TT частичные классы по умолчанию ,, так что это означает, что, если я хочу изменить базы данных и воссоздать Dbcontext, все аннотации данных и вспомогательные методы будут удалены, так как я могу избежать этого, поэтому все аннотации данных и вспомогательные методы не будут удалены, даже если снова создать Dbcontext? –

+0

Если вы используете шаблоны tt, вам нужно использовать частичные классы, если вы не измените шаблоны tt, чтобы добавить их для вас на основе схемы модели ... Или вы перепроектируете, как я уже говорил –

+0

Но я не могу создать те же частичные классы для определения моих метаданных, поскольку визуальная студия вызовет ошибку, которую классы уже просматривают. –

0

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

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

+0

Я использовал генерацию кода Dbcontext для отображения моих существующих таблиц, затем создает папку .tt, содержащую мои таблицы в качестве классов; поэтому я могу применить аннотацию данных на стороне клиента к самим классам. Так что я начал использовать оценку Db и их после сопоставления в первой оценке кода. BR –

+0

, но если я применим аннотации данных непосредственно к классам, то я потеряю их, я должен изменить базу данных и регенерировать классы структуры сущности. BR –

+0

DbContext не является эксклюзивным для первого рабочего процесса. Вы можете передать EntityConnection в конструктор, чтобы загрузить ваши метаданные из установки модели данных сущности, создающей ее из кода. Этот шаблон позволяет использовать шаблон [DbContext] (http://visualstudiogallery.msdn.microsoft.com/7812b04c-db36-4817-8a84-e73c452410a2). – bricelam