Подтвердить что ты не робот

Создание классов POCO в разных проектах проекта с помощью модели Entity Framework

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

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

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

  • Один для самих объектов (т.е. ModelName.tt)
  • Один для ObjectContext (т.е. ModelName.Context.tt)

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

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

Подробнее см. шаги 5 и 6: http://blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx.

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

Алекс

Ответ 2

@Nick,

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

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

Joel

Ответ 3

Для генератора 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())
{
#>

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

Ответ 4

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

"Не удалось определить MetaTable. Не удалось определить MetaTable для источника данных" EntityDataSource1 ", и его нельзя определить по URL-адресу запроса. Убедитесь, что таблица сопоставлена с источником данных или источник данных настроен". с допустимым типом контекста и именем таблицы, или что запрос является частью зарегистрированного DynamicDataRoute. "