Как изменить сгенерированные имена классов, созданные с помощью Entity Framework Power Tools
Ребята работают над проектом Asp.Net MVC, который уже использует шаблон репозитория для извлечения данных из базы данных MS SQL Server.
Теперь я намереваюсь использовать Entity Framework для некоторых новых конкретных требований нашего проекта, не нарушая старую логику хранилища. Я использовал инструмент EF Power Beta 3 и Reverse Engineered для своих таблиц базы данных из Visual Studio, но сгенерированные классы конфликтуют с некоторыми из моих существующих классов репозитория, имена которых совпадают с именами соответствующих таблиц в базе данных, что делает проект неспособным к компиляции. Я посмотрел на этот урок
Но это говорит о добавлении префикса "tbl" к именам таблиц, а не об изменении сгенерированных имен классов. Однако я сам пытался изменить сгенерированные имена классов в шаблонах (представленных в CodeTemplates\ReverseEngineerCodeFirst, но все же они генерируются с конфликтами.
Мой вопрос заключается в том, что я должен сделать, чтобы достичь желаемого результата (без конфликтов с существующими классами в проекте), или я должен принять какую-то другую альтернативу в целом? Спасибо за помощь.
3 ответа
Я не знаю, как заставить инструмент делать то, что вы просите, но как насчет изменения пространства имен в вашем сгенерированном файле, чтобы дублирующие имена не имели значения?
Хорошо, учитывая предложение @jlew, я нашел обходной путь, и он щелкнул:
Вот:
Сначала я сделал перезапись шаблонов по умолчанию, созданных в папке "CodeTemplates/ReverseEngineerCodeFirst" с помощью пользовательских шаблонов, загруженных по следующей ссылке:
http://romiller.com/2012/05/09/customizing-reverse-engineer-code-first-in-the-ef-power-tools/
(Примечание. Это делается для того, чтобы использовать аннотации данных для конфигурации, а не Fluent API и чтобы сопоставления столбцов и таблиц выполнялись с аннотациями данных. Подробнее см. Ссылку выше).
Тогда я сделал следующее:
В Context.tt файл заменен
using <#= code.EscapeNamespace(efHost.MappingNamespace) #>; namespace <#= code.EscapeNamespace(efHost.Namespace) #>
с
<#
var hostMapNamespace = code.EscapeNamespace(efHost.MappingNamespace);
hostMapNamespace = hostMapNamespace.Replace(".Models", ".ModelsEF");
var hostNamespace = code.EscapeNamespace(efHost.Namespace);
hostNamespace = hostNamespace.Replace(".Models", ".ModelsEF");
#>
using <#= hostMapNamespace #>;
namespace <#= hostNamespace #>
2- В файле Entity.tt заменен
namespace <#= code.EscapeNamespace(efHost.Namespace) #>
с
<#
var hostNamespace = code.EscapeNamespace(efHost.Namespace);
hostNamespace = hostNamespace.Replace(".Models", ".ModelsEF");
#>
namespace <#= hostNamespace #>
3- В файле Mapping.tt заменен
namespace <#= code.EscapeNamespace(efHost.Namespace) #>
с
<#
var hostMapNamespace = code.EscapeNamespace(efHost.Namespace);
hostMapNamespace = hostMapNamespace.Replace(".Models", ".ModelsEF");
#>
namespace <#= hostMapNamespace #>
Короче говоря, я несколько изменил генерацию пространства имен в пользовательских шаблонах, чтобы избежать конфликтов с любыми существующими классами проекта, особенно в пространстве имен Models. Хорошо, что... это работает!
Я знаю, что это старый вопрос, но это может кому-то пригодиться.
Мне также нужно было переименовать классы каркасов из DBS. В моем случае я хотел добавитьEntity
суффикс.
Поэтому, если вы используете EFPower Tools, создайте в верхней части файла структуры проекта:
efpt.renaming.json
со следующим содержанием:
[
{
"SchemaName": "App", // <----- change this
"TableRegexPattern": "$",
"TablePatternReplaceWith": "Entity",
"UseSchemaName": false
},
{
"SchemaName": "Enum", // <----- change this
"TableRegexPattern": "$",
"TablePatternReplaceWith": "Entity",
"UseSchemaName": false
},
{
"SchemaName": "LinkTable", // <----- change this
"TableRegexPattern": "$",
"TablePatternReplaceWith": "Entity",
"UseSchemaName": false
}
]
Каждая схема DBS должна быть указана, в моем случае 3. Затем убедитесь, что в вашем файлеefpt.config.json
вы указали значение:
"UseDatabaseNames": false
потому что если этоtrue
эти изменения переименования не будут применяться. Вы также можете найти эту опцию в пользовательском интерфейсе EFPT здесь (сделайте ее отключенной):
После внесения всех этих изменений запустите обратное проектирование инструмента EFPower, и ваши новые объекты должны быть созданы с новыми именами.