Как адаптировать шаблон Entity Framework POCO T4 для создания классов в отдельном проекте?

Мне нравится, чтобы мой код был первым — или сгенерированным T4 — POCO в проекте, отделенном от DbContext. Это помогает мне убедиться, что мои классы сущностей не связаны ни с одной службой доступа к данным.

Когда я создаю новую модель EDMX для БД, мастер создает шаблон T4 для создания всех POCO в том же проекте, что и DbContext. Как изменить этот шаблон, чтобы добавить классы в отдельный проект?

При ближайшем рассмотрении, вероятно, было бы намного проще переместить DbContext в новый проект, но T4 для этого не имеет вызова fileManager.StartNewFile, поэтому я не знаю, с чего начать, чтобы он создал файл в другом месте.


person ProfK    schedule 19.12.2012    source источник
comment
ProfK, можете пояснить, как вам удалось заставить poco генерироваться в отдельный проект? Я пытаюсь сделать то же самое, используя EF и лук.   -  person jr3    schedule 16.10.2013
comment
@ jr3 Я действительно не помню, но я думаю, что просто изменил выходной путь .tt, который использует мастер EF.   -  person ProfK    schedule 17.10.2013


Ответы (2)


Вы можете исключить файл .tt из своего проекта DAL, а затем добавить его как ссылку в другой проект.

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

Файлы, созданные при запуске шаблона, будут включены в вашу сборку объектов данных, хотя физические файлы будут в вашем проекте DAL.

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

person Nick Butler    schedule 19.12.2012
comment
@atconway щелкните правой кнопкой мыши файл .tt в обозревателе решений и запустите пользовательский инструмент. - person Nick Butler; 04.01.2013
comment
Поскольку физические файлы теперь находятся в отдельном проекте (по желанию), но мой файл MyModel.context.cs находится в исходном проекте с .edmx, как мне сообщить ему, куда файлы были перемещены? Я добавил ссылку на отдельный проект, но без размещения оператора using в моем файле контекста для пространства имен нового проекта такие строки терпят неудачу: public DbSet<Person> People { get; set; } он должен выглядеть как public DbSet<MyProject.DAL.Person> People { get; set; } Однако это автоматически сгенерированный код, и я не хочу сделай это. - person atconway; 05.01.2013
comment
Только что понял: значение Custom Tool Namespace в свойствах Context.tt можно обновить до правильной ссылки, т. е. MyProject.DAL, и ссылки будут разрешены. - person atconway; 05.01.2013

Я бы сказал:

1.- Создайте файл в своем проекте модели (проект MyProject.Model), файл .tt с желаемым именем... (MyModel.tt для этого примера)

2.- Перейдите в проект DAL, откройте файл WhateverModel.tt и скопируйте содержимое в MyModel.tt...

3.- Удалите WhateverModel.tt из проекта DAL.

4.- Найдите в MyModel.tt:

const string inputFile = @"WhateverModel.edmx";

5.- И замените его на:

const string inputFile = @"..\TheRelativeRouteToYourEdmxFileGoesHere.edmx";

6.- И... Запустите пользовательский инструмент для создания вашей модели.

Примечание: 7.- Конечно, вам придется изменить несколько директив using и пространств имен, но у меня это работает.

person Juan    schedule 09.03.2016