Как сопоставить классы из генератора DBContext с существующими классами домена POCO

Я новичок в Entity Framework и первом подходе к базе данных. Может кто-нибудь мне помочь?

Вот случай:

У меня есть чистый, обычный доменный класс (Person) только со свойствами. Этот класс определен в VS-проекте, который будет содержать только доменные классы без какой-либо ссылки на Entity Framework или другие вещи, принадлежащие уровню доступа к данным.

У меня также есть таблица базы данных (tblPerson). Я создал для него EDMX и использовал DbContext Generator для создания для него POCO-классов.

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

Вопрос в том:

Как мне «сопоставить» POCO-класс Entity Framework с моим существующим классом домена? У них такие же свойства. Я читал что-то о прокси, классах друзей и многом другом, но не нашел хороших примеров.

Пожалуйста помоги.


Допустим, класс модели предметной области выглядит так (просто пример):

public class Person
{
   public int Id { get; set; }
   public string Name { get; set; }
}

и таблица базы данных имеет те же столбцы:

Идентификатор (целое число, не нуль, первичный ключ) Имя (nvarchar(50), не нуль)


Обновление:

Хорошо, я нашел решение. Я сделал то, что предложил Ладислав Мрнка и получил от ObjectContext. Вот страница, описывающая, как это делается: Entity Framework 4.0. Часть 4. Как использовать собственные POCO


person Jo Inge Arnes    schedule 19.08.2012    source источник
comment
Вам не нужно иметь какой-либо класс EF POCO, если только вашему доменному классу не требуется что-то особенное. Вы можете напрямую сопоставить свой класс домена (кстати, класс домена только со свойствами совсем не похож на класс домена). Обновите свой вопрос некоторыми примерами таблицы, класса poco и класса домена и опишите причину, по которой вам нужен дополнительный уровень сопоставления - подсказка: хранение ссылок на EF отдельно от проекта классов домена не является достаточной причиной, поскольку ваши классы poco EF могут быть в отдельных проект без какой-либо ссылки на EF.   -  person Ladislav Mrnka    schedule 20.08.2012
comment
Спасибо за ответ. Как я могу напрямую сопоставить EF с моим классом модели предметной области? Это было бы решением моего вопроса. Я не могу сначала использовать код, потому что база данных уже существует и используется.   -  person Jo Inge Arnes    schedule 20.08.2012
comment
Ваш объект в EDMX должен точно соответствовать классу вашего домена. Вам нужно отключить генерацию кода и создать собственный производный контекст (если вы этого хотите), используя ObjectSet с вашими классами предметной области.   -  person Ladislav Mrnka    schedule 20.08.2012
comment
В порядке. EDMX точно соответствует моему классу модели предметной области, поэтому я попробую поискать в Google и прочитать о том, как я могу создать производный контекст. Большое Вам спасибо.   -  person Jo Inge Arnes    schedule 20.08.2012
comment
Вы можете абсолютно использовать код сначала для существующих и новых баз данных.   -  person devdigital    schedule 20.08.2012


Ответы (2)


Если вы хотите сопоставить свои «объекты домена» с созданными EF классами POCO, вы можете использовать сопоставитель, такой как AutoMapper https://github.com/AutoMapper/AutoMapper/wiki

person podiluska    schedule 20.08.2012
comment
Но важно сохранить EF-функциональность, такую ​​как отложенная загрузка и т. д., поэтому я хочу, чтобы EF-классы расширяли классы моей предметной области. Например, как это делается с кодом в первую очередь. Простого сопоставления значений будет недостаточно. Что я хочу сделать, так это просто использовать свои собственные классы в качестве POCO-классов (например, сначала в коде) вместо классов, сгенерированных DbContext Generator. - person Jo Inge Arnes; 20.08.2012
comment
Затем сделать классы предметной области частичным классом класса EF? - person podiluska; 20.08.2012
comment
Подилушка: Хорошо, спасибо. Это, вероятно, будет хорошим способом достичь того, что я ищу. Я рассмотрю ваше предложение, а также предложение Ладислава Мрнки и обновлю свой пост, когда найду решение. :) - person Jo Inge Arnes; 20.08.2012

Хорошо, я нашел решение. Я сделал то, что предложил Ладислав Мрнка и получил от ObjectContext. Вот страница, описывающая, как это делается: Entity Framework 4.0. Часть 4. Как использовать собственные POCO

person Jo Inge Arnes    schedule 20.08.2012