Обратное проектирование подмножества таблиц для Entity Framework
Я использую EF, и у меня есть расширение Entity Framework Power Tools, которое позволяет мне перепроектировать классы на основе таблиц в данной базе данных.
У нас довольно обширная БД, с большим количеством таблиц, которые мне не нужно представлять. Есть ли какой-либо простой способ выбрать подмножество из них, и реконструировать только те?
Ответы
Ответ 1
Я нашел решение, которое работает, хотя оно требует нескольких "дополнительных" шагов:
В проекте щелкните правой кнопкой мыши и выберите Add
> new Item
. Выберите Data
слева и ADO.NET Entity Data Model
из списка элементов.
В появившемся диалоговом окне/мастере вы можете выбрать БД для создания модели, и в этом случае вы можете выбрать только те таблицы, представления и хранимые процедуры и функции, которые вам нужны.
После добавления модели вы можете развернуть ее в обозревателе решений и найти нужные классы в YourModelName.edmx
→ YourModelName.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.
Любая таблица с факсом или отчет в имени немедленно исключается.
Любая таблица с фирмой в названии включена.
Осталось:
Ответ 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 и восстановите модель с помощью "Обратного кода инженера сначала".