Обратное проектирование подмножества таблиц для Entity Framework

Я использую EF, и у меня есть расширение Entity Framework Power Tools, которое позволяет мне перепроектировать классы на основе таблиц в данной базе данных.

У нас довольно обширная БД, с большим количеством таблиц, которые мне не нужно представлять. Есть ли какой-либо простой способ выбрать подмножество из них, и реконструировать только те?

Ответы

Ответ 1

Я нашел решение, которое работает, хотя оно требует нескольких "дополнительных" шагов:

В проекте щелкните правой кнопкой мыши и выберите Add> new Item. Выберите Data слева и ADO.NET Entity Data Model из списка элементов.

В появившемся диалоговом окне/мастере вы можете выбрать БД для создания модели, и в этом случае вы можете выбрать только те таблицы, представления и хранимые процедуры и функции, которые вам нужны.

После добавления модели вы можете развернуть ее в обозревателе решений и найти нужные классы в YourModelName.edmxYourModelName.tt

.Примечание: вы не сможете перетаскивать исходные файлы, но вы можете щелкнуть правой кнопкой мыши и выбрать copy class. Затем вы можете вставить их туда, где они вам нужны, и они появятся с добавленным "1" к их именам. Поэтому вам нужно будет выполнить небольшой рефакторинг (изменение имени файлов, классов и пространств имен), но это все еще довольно просто.

Теперь вы можете удалить оригинальную модель (edmx файл) и все, что находится под ней.

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

Ответ 2

Если ваша база данных является SQL Server или SQL Server CE 4.0, вы можете использовать "Entity Framework Reverse POCO Generator", доступный по адресу visualstudiogallery.msdn.microsoft.com

Он выполняет фильтрацию таблицы с помощью TableFilterExclude, TableFilterInclude.

Способ работы фильтров выглядит следующим образом:

  • Прочитайте схему
  • Удалите все таблицы, соответствующие фильтру исключения, если они есть.
  • Включите любые таблицы, соответствующие фильтру include, если они есть.

Пример:

TableFilterExclude = new Regex("billing|report");
TableFilterInclude = new Regex("company");

Учитывая следующие таблицы:

  • some_table
  • компании
  • company_billing_annual
  • company_billing_ledger
  • company_reports
  • company_events
  • another_table.

Любая таблица с факсом или отчет в имени немедленно исключается. Любая таблица с фирмой в названии включена.

Осталось:

  • компании
  • company_events

Ответ 3

На данный момент нет возможности исключать таблицы из коробки с помощью EF Power Tools. Они говорят, что этот запрос функции уже находится в отставании, но неясно, собирается ли он сделать это в RTM.

Я видел два основных подхода к этому:

  • Подстройте шаблоны обратного проектирования, чтобы игнорировать все нежелательные таблицы (хотя я лично считаю это грязным). Если вы хотите начать работу над движущимися частями, вот статья от Роуэн Миллер (http://romiller.com/2012/05/09/customizing-reverse-engineer-code-first-in-the-ef-power-tools/)

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

Ответ 4

Старый вопрос с ответом, но он единственный, что появляется из поиска Google, поэтому я решил, что опубликую свое решение для Entity Framework Power Tools, фильтрует подмножество таблиц.

  • После установки инструментов VSIX EF Power и щелкните правой кнопкой мыши по решению и выберите Entity Framework → Custom Reverse Engineer Templates. Несколько файлов .tt будут сгенерированы под Sln-root/CodeTemplates/ReverseEngineerCodeFirst, откройте каждый из них.

  • Context.tt - найдите цикл foreach в строке 27 и вставьте код для фильтрации внутри цикла foreach:

    // START Filter for specific tables only
    string[] filterTables = new string[] { "Motorcycle", "Person" };
    if (!filterTables.Contains(set.ElementType.Name.ToString()))
    {
        continue;   
    }
    // END Filter for specific tables only
    

Это приведет к созданию строк public DbSet< для таблиц, не указанных в вашем массиве filterTables.

В строке 38 внутри цикла foreach вставьте тот же код, что и выше. Это приведет к выходу modelBuilder.Configurations.Add.

  • Entity.tt - найдите строку 6 и вставьте код, который будет возвращать пустой и escape файл для таблиц, не входящих в массив filterTables:

    // START Filter for specific tables only
    string[] filterTables = new string[] { "Motorcycle", "Person" };
    if (!filterTables.Contains(efHost.EntityType.Name.ToString()))
    {
        return "";  
    }
    // END Filter for specific tables only
    
  • Mapping.tt - найдите строку 14 и вставьте тот же код, что и выше:

    // START Filter for specific tables only
    string[] filterTables = new string[] { "Motorcycle", "Person" };
    if (!filterTables.Contains(efHost.EntityType.Name.ToString()))
    {
        return "";  
    }
    // END Filter for specific tables only
    
  • Сохраните все файлы .tt и восстановите модель с помощью "Обратного кода инженера сначала".