Изменение имен объектов и свойств в базе данных сначала

Я запускаю новое приложение, которое должно использовать существующую базу данных, в которой используются некоторые соглашения об именах, которые действительно раздражают в .net(имена таблиц начинаются с нескольких триграмм, которые определяют бизнес-домен таблицы, имена столбцов начинаются с таблиц триграмма, триграммы находятся в верхнем регистре и разделены символами подчеркивания и т.д.,).

То, что я хотел бы сделать, - написать простое правило переименования (это так же просто, как найти последний символ подчеркивания и взять все после этого) и применить его в Entity Framework. Я не хочу редактировать имена один за другим в редакторе, особенно потому, что база данных может измениться, и я не хочу делать это несколько раз.

Я использую Database First (поскольку база данных уже существует, и она является "мастером" ) и EF 4.x DbContext Generator, и она отлично работает из коробки (с плохо названными классами и свойствами).

Я редактировал шаблоны T4, чтобы переименовать сгенерированные объекты и свойства, но когда я пытаюсь выполнить любой запрос, объект DbContext не может найти таблицу, которая соответствует сущности, которую я пытаюсь запросить, и я получаю это исключение:

Тип сущности [имя объекта] не является частью модели для текущий контекст.

Это очевидно, почему он не находит таблицу: ничто не говорит о том, как сопоставить имя сущности и таблицу, когда я менял ее на лету. Я читал, что я могу добавлять инструкции в метод OnModelCreating(DbModelBuilder modelBuilder), но это не используется в Database First (и шаблон T4 по умолчанию добавляет к нему исключение на всякий случай).

Итак, теперь я застрял, я не знаю, как указать это соответствие.

Вот несколько идей, которые я имею, но не уверен, что они исправлены или выполнимы:

  • Использование API "множественного/единственного числа" для изменения имени Entity? Похоже на грязное обходное решение. Но это может сработать (хотя и не пыталось).
  • Поиск способа редактирования файла EDMX на лету.
  • Редактирование EDMX впоследствии, но это может усложнить процесс (отредактируйте в дизайнере, затем выполните инструмент для изменения EDMX, затем запустите собственный инструмент для регенерации сущностей и DbContext..., хотя сегодня мне просто нужно редактировать в дизайнере).
  • Использование Code First (так как проще использовать разные имена сущностей, чем имена таблиц, через атрибуты или инструкции в классе DbContext), но похоже, что было бы не сложнее использовать его с существующей базой данных.

Любая идея? Или я что-то пропустил?

Ответ 1

Вы не сможете использовать для этого преобразование T4, так как вы хотите изменить содержимое фактического файла .edmx для сопоставления имен объектов хранилища (с отвратительными префиксами) к вашим дезинфицированным концептуальным именам объектов.

Вместо этого вам лучше писать приложение, которое принимает файл .edmx в качестве входных данных и дезинфицирует имена под тегом концептуальной модели и изменяет имена сопоставлений, чтобы отразить дезинфицированные имена. Я понимаю, что это ваш третий вариант, и вы хотели избежать этого, если это возможно, но это самый простой способ сделать это. Имейте в виду, что вам нужно будет запустить этот инструмент только при добавлении новых таблиц или столбцов.