Как изменить сгенерированные имена классов, созданные с помощью 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 и чтобы сопоставления столбцов и таблиц выполнялись с аннотациями данных. Подробнее см. Ссылку выше).

Тогда я сделал следующее:

  1. В 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, и ваши новые объекты должны быть созданы с новыми именами.

Другие вопросы по тегам