У меня есть устаревшая база данных, которая имеет несколько таблиц, которые были разработаны с использованием Polymorphic Associations. По полиморфным ассоциациям я имею в виду, что эти таблицы могут быть дочерними из разных таблиц в соответствии с столбцом ObjectType
.Полиморфные ассоциации в инфраструктуре Entity
Пример:
Documents
таблица имеетDocumentID
(первичный ключ идентичности), некоторые другие столбцы и 2 специальные столбцы называемыеObjectType
иObjectID
.- Если
ObjectType='STUDENT'
,ObjectID
указывает наStudents
стол. - Если
ObjectType='TEACHER'
,ObjectID
указывает на таблицуTeachers
и т.д.
Это похоже на this design (как описано в «нет внешнего ключа подхода») или this one (описанного в качестве анти-паттерна). И, очевидно, есть ограничений внешнего ключа на этих столбцах (AFAIK без базы данных допускает такую зависимость).
Я пишу новый уровень доступа к данным, используя Entity Framework 6 (сначала код с Fluent API), который должен работать бок о бок с существующим кодом. Поскольку эта структура базы данных была развернута сотнями разных клиентов (каждая из которых имеет различную базу кода и различные настройки базы данных), изменение структуры существующих таблиц не является вариантом.
Мой вопрос: Как сопоставить эти Полиморфные ассоциации в моей первой модели кода EF?
EDIT: Кажется, что я пытался разработать иерархию классов на неправильных сущностей. Я понял, что у меня было много «GenericChildTables» (например, Documents), которые должны указывать на (несуществующий) объект, который будет иметь составной ключ ObjectType + ObjectID. И затем я пытался создать этот новый объект (назовем его «BusinessObject») и сопоставить мои основные объекты (учащиеся, учителя и т. Д.) Как подтипы этого объекта BusinessObject.
Этот дизайн, вероятно, был просто неправильным, и, возможно, совершенно невозможно, потому что эта новая таблица, которую я создавала (BusinessObject), зависела от StudentID/TeacherID и т. Д., Поэтому она не могла быть родителем этих таблиц. Используя некоторые уродливые обходные пути, я мог бы создать этот BusinessObject как одно дочерний для каждого основного объекта и сопоставить эти BusinessObjects с полиморфными таблицами, и он работал действительно, но в совершенно неправильном дизайне.
Тогда я увидел Gert Ardold's question и понял, что должен быть выполнен в виде иерархии классов НЕ был Студенты/Преподаватели/и т.д. (сгруппированных в общей сущности), но каждый из этих ChildTables, которые держали в руках различные подтипы в соответствии с дискриминатор ObjectType
- это те типы, которые должны быть разделены на подтипы. См. Мое решение по моему собственному ответу ниже.
[Здесь] (http://stackoverflow.com/q/13953675/861716), как я это сделал, используя сначала базу данных, но также описал, как я не смог перенести его в код-первый. –
@GertArnold Вы пробовали что-то вроде этого https://gist.github.com/mauriciolobo/40a4fc6017539c79135bf62f57ee80f1? – drizin
Нет, это не правильная модель (два внешних ключа). –