Entity Framework Inheritance и Persisted Column - PullRequest
2 голосов
/ 04 апреля 2011

У меня возникли некоторые проблемы в структуре сущностей из-за наследования. Итак, у меня есть что-то вроде этой базы данных:

PROFILE
Id int identity [PK]
ProfileTypeId int [FK] [PK]

PROFILETYPE
Id int [PK]

COMPANY
ProfileId int [FK] [PK]
ProfileTypeId AS 1 PERSISTED [FK] [PK]

PERSON
ProfileId int [FK] [PK]
ProfileTypeId AS 2 PERSISTED [FK] [PK]

Я хочу реализовать наследование, ПРОФИЛЬ может быть КОМПАНИЕЙ или ЛИЦОМ, и он является эксклюзивным, поэтому FK в КОМПАНИИ - это ProfileId и ProfileTypeId для PROFILE, чтобы сделать его эксклюзивным.

Но когда я пытаюсь создать компанию в рамках сущности, это нарушает ФК в ПРОФИЛЕ к ПРОФИЛЕ. Возможно, потому что в КОМПАНИИ сохраняется ProfileTypeId, он не заполняет значение в ПРОФИЛЕ, кто-нибудь знает обходной путь, чтобы заставить его работать с структурой сущностей?

Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2011

В этой схеме базы данных есть две очень большие проблемы:

  1. ProfileTypeId в производных таблицах - это вычисляемый столбец, поскольку ProfileTypeId в родительской таблице также будет обрабатываться как вычисляемый столбец. EF не допускает вычисляемые столбцы в первичных ключах. Даже если это позволяет им, ваш сценарий не будет работать. Вы не сможете вставить ни Company, ни Person, потому что EF никогда не отправляет значение вычисляемых столбцов в базу данных. Поэтому вставки будут иметь нарушение внешнего ключа, потому что Profile всегда будет иметь ProfileTypeId равным нулю.
  2. EF не позволяет внешнему ключу быть вычисляемым столбцом.

Вывод: вы не можете отобразить это в EF.

Вы должны либо избавиться от ProfileTypeId и ProfileType, потому что эта информация полностью избыточна для EF, либо вы можете попытаться построить какое-либо представление поверх этих таблиц и отобразить это представление в виде таблицы на иерархию (TPH) и использовать хранимые процедуры или 1017 * триггеры для вставки данных в ваши таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...