У меня есть проект, в котором мне нужно разработать систему сущностей с первым кодом с существующей базой данных. Эти существующие таблицы в базе данных - это не просто таблицы, они были созданы с помощью инструмента Microsoft ERP "Dynamics Navision". Инструмент Navision хранит различную информацию о компании и создает разные таблицы для каждой компании. Предположим, есть 3 типа таблиц;
- Таблица X
- ТаблицаY
- ТаблицаZ
А также есть 3 разные компании;
- Компания А
- КомпанияB
- КомпанияC
Инструмент создал 9 различных таблиц из приведенных выше комбинаций. Он просто дублирует все таблицы и добавляет к именам таблиц префикс с названием компании. В итоге наша база данных выглядит так:
- КомпанияA $ TableX
- КомпанияA $ TableY
- КомпанияA $ TableZ
- КомпанияB $ TableX
- КомпанияB $ ТаблицаY
- КомпанияB $ TableZ
- КомпанияC $ TableX
- КомпанияC $ TableY
- КомпанияC $ TableZ
Чем я занимался до сих пор?
Итак, как видите, есть возможность упростить эту архитектуру на стороне Entity Framework. Для этого я создал 3 класса сущностей для TableA, TableB, TableC и во время выполнения я позволил пользователю выбрать компанию, и в соответствии с выбранной компанией я отразил свой класс сущности с помощью настраиваемого TableAttribute
, где имя таблицы было префиксом с названием компании. Я не собираюсь подробно рассказывать, как я этого добился прямо сейчас (но вы можете найти подробности реализации в этой статье: LINK), но пока все хорошо, и я применил все предыдущие шаги успешно, и мне удалось быть динамичным по именам таблиц с выбранной компанией. Однако есть еще одна проблема.
Какой у меня вопрос?
Проблема в том, что даже несмотря на то, что мне удалось создать систему, в которой я могу изменить атрибут имени таблицы класса сущности во время выполнения и получить доступ к таблицам целевых компаний, не было никакой гарантии, что дублированные таблицы с разными префиксами названий компаний разделяют% 100 та же внутренняя архитектура поля. Например, CompanyA$TableX
может иметь 5 полей, а CompanyB$TableX
- 6 полей, где первые 5 полей совпадают с полями CompanyA $ TableX, но последнее 1 поле является дополнительным. Давайте также визуализируем это;
Поля таблицы CompanyA$TableX
;
- ID
- Имя
- Фамилия
- Адрес
- Телефонный номер
Поля таблицы CompanyB$TableX
;
- ID
- Имя
- Фамилия
- Адрес
- Телефонный номер
- Электронная почта
Как видите, поле Email
является дополнительным, однако имена таблиц такие же (TableX), отличается только компания, и в моей системе они используют один и тот же класс сущности и название компании, определенное во время выполнения, как я упоминал ранее.
Итак, я хочу знать, как мне добиться в этом динамизма. Как я могу иметь только один класс сущности, но быть динамичным в полях этого класса в соответствии с выбранной компанией. Я хочу знать, возможно ли это технически, и если да, то как это реализовать. Заранее спасибо.