Создание классов POCO в разных проектах для проекта с моделью Entity Framework - PullRequest
43 голосов
/ 17 марта 2010

Я пытаюсь использовать шаблон репозитория с EF4, используя VS2010.

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

То, что я хотел бы сделать, - это структурировать мое решение в отдельные проекты для классов Entity (POCO) и еще один проект для модели сущностей и кода репозитория.

Это означает, что мой проект MVC может использовать классы POCO для строго типизированных представлений и т. Д., И ему не нужно знать о хранилище или иметь ссылку на него.

Чтобы соединить все это вместе, у меня будет другой отдельный проект с интерфейсами и я буду использовать IoC.

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

Спасибо

Ответы [ 3 ]

38 голосов
/ 18 марта 2010

На самом деле шаблоны T4 в EF 4.0 были разработаны с учетом этого сценария:)

Есть 2 шаблона:

  • Один для самих сущностей (т.е. ModelName.tt)
  • Один для ObjectContext (т.е. ModelName.Context.tt)

Вы должны поместить файл ModelName.tt в свой проект POCO и просто изменить шаблон так, чтобы он указывал на файл EDMX в проекте с сохранением.

Звучит странно, я знаю: теперь есть зависимость, но это во время генерации T4, а не во время компиляции! И это должно быть хорошо? Потому что полученная сборка POCO все еще остается невежественной.

См. Шаги 5 и 6 этого: http://blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx для получения дополнительной информации.

Надеюсь, это поможет

Алекс

5 голосов
/ 24 мая 2010

@ Ник,

  1. Чтобы принудительно восстановить объекты POCO, вам просто нужно щелкнуть правой кнопкой мыши основной файл .tt и выбрать «Запустить пользовательский инструмент». Это заставит его восстановить ваши классы POCO с вашими обновленными изменениями в модели .edmx.
  2. Есть ли какие-либо проблемы с тем, что вы идете вперед и щелкаете правой кнопкой мыши по модели и выбираете «Создать базу данных из модели ...», даже если вы не обязательно генерируете базу данных? Это, скорее всего, избавит вас от «ошибки 11007 ...».
  3. Я думаю, что это эквивалентно «Коду позади». Я не знаю больше, чем это.

Еще одна вещь, которую следует отметить относительно ссылки, которую дала Алекс. После того, как я переместил свой основной файл .tt в другой проект, файл, созданный из файла ".Context.tt", не скомпилировался, поскольку в нем отсутствовали ссылки на файлы POCO, расположенные в другом пространстве имен (поскольку мой ObjectContext должен находиться в другом домене, чем мои файлы POCO). Мне пришлось изменить файл .Context.tt так, чтобы он имел using Poco.Namespace (где Poco.Namespace - это имя пространства имен, в котором были созданы файлы POCO). Это позволило моему проекту скомпилироваться.

Joel

4 голосов
/ 10 октября 2013

Для генератора EF5 + DbContext: легко переместить ваш Name.Context.tt в другой проект. Однако вам нужно будет ссылаться на классы модели. Вы можете сделать это вручную, но для этого потребуется менять его каждый раз, когда генерируется код. Вы также можете использовать одно и то же пространство имен для обоих проектов. Это действительно и будет работать, но я думаю, что это плохой дизайн. Другой альтернативой является изменение шаблона T4 (Name.Context.tt).

Изменить это (строка 43):

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>

К этому:

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (modelNamespace != codeNamespace)
#>
using <#=code.EscapeNamespace(modelNamespace)#>;
<#
if (container.FunctionImports.Any())
{
#>

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

...