Я запускаю новое приложение, которое должно использовать существующую базу данных, в которой используются некоторые соглашения об именах, которые действительно раздражают в .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), но похоже, что было бы не сложнее использовать его с существующей базой данных.
Любая идея? Или я что-то пропустил?