В настоящее время у меня есть модель Entity Framework 4.0 с таблицей на тип (TPT), но есть несколько проблем с производительностью (много операторов LOJ / CASE), а также сопоставление проблем между двумя конкретными областями домена (многие-в-многим).
Я решил попробовать TPH.
У меня есть объект с именем " Location ", который abstract и база для всех других объектов.
У меня тогда есть " Страна ", " Город ", " Штат ", " Street"и т. Д., Которые все происходят из Location.
" LocationType"- это dicriminator .
Эта часть работаетхорошо, но у меня возникают проблемы при попытке определить навигационные свойства для производных типов.
Например, " State " имеет один " Country ",поэтому я должен быть в состоянии сделать это:
var state = _ctx.Locations.OfType<State>().Include("Country").First();
var countryForState = state.Country;
Но для этого потребуется навигационное свойство "Страна" в производном объекте "Состояние".Как мне это сделать?Когда я генерирую модель из базы данных, у меня есть одна таблица со всеми FK, указывающими на записи в одной и той же таблице:
(ПРИМЕЧАНИЕ. Я создал эти FK вручную вDB).
Но FK помещаются в виде nav на сущность " Location ", так как я могу переместить эти навигационные свойства вниз к производным сущностям?Я не могу скопировать + вставить навигационные элементы, и я не могу «создать новое навигационное свойство», потому что оно не позволит мне определить начальную / конечную роль.
Как нам это сделать?
С TPH также неясно, можем ли мы сделать это сначала на модели, или мы ДОЛЖНЫ начать с БД, исправить модель, а затем заново сгенерировать БД.Мне еще предстоит найти хороший пример в Интернете о том, как определить навигацию для детей с TPH.
ПРИМЕЧАНИЕ: Я не хочу делать сначала код .Мое текущее решение имеет TPT с EDMX и чистые POCO, я надеюсь не повлиять на модель / репозитории домена (если возможно), а просто обновить модель / базу данных EF.
EDIT
По-прежнему нет решения - однако я пытаюсь сделать сначала модель, и делаю Add -> New Association, что фактически позволяет мне добавить навигацию к производным сущностям.Но когда я пытаюсь «Сгенерировать базу данных из модели», он все еще пытается создать таблицы для «Location_Street», «Location_Country» и т. Д. Это почти как TPH не может быть сделано в первую очередь моделью.
EDIT
Вот моя текущая модель:
Ошибка проверки, которую я сейчас получаю:
Ошибка 1 Ошибка 3002:Проблема при отображении фрагментов, начинающихся со строки 359. Потенциальное нарушение во время выполнения таблицы Ключи Locations (Locations.LocationId): Столбцы (Locations.LocationId) сопоставляются со свойствами EntitySet NeighbourhoodZipCode (NeighbourhoodZipCode.Neighbourhood.LocationId), но не имеют концептуальной стороны.ключевые свойства EntitySet (NeighbourhoodZipCode.Neighbourhood.LocationId, NeighbourhoodZipCode.ZipCode.LocationId).
Просто подумал, что продолжу редактировать этот вопрос с правками относительно того, где я сейчас нахожусь.Я начинаю задаваться вопросом, возможна ли даже ТПХ с самоссылающимися ФК.
РЕДАКТИРОВАТЬ
Итак, я выяснил вышеупомянутую ошибку, потому что я пропалтаблица соединения для Neighborhood-ZipCode многие ко многим.
Добавление таблицы соединения (и сопоставление навигационных данных с этим) решило вышеуказанную ошибку.
Но теперь я получаю эту ошибку:
Ошибка 3032: проблема в отображении фрагментов, начинающихся со строк 373, 382: члены условия Locations.StateLocationId имеют дублированные значения условий.
Если я смотрю наCSDL, вот сопоставление ассоциации для "CountyState" (штат имеет много округов, округ имеет 1 штат):
<AssociationSetMapping Name="CountyState" TypeName="Locations.CountyState" StoreEntitySet="Locations">
<EndProperty Name="State">
<ScalarProperty Name="LocationId" ColumnName="StateLocationId" />
</EndProperty>
<EndProperty Name="County">
<ScalarProperty Name="LocationId" ColumnName="LocationId" />
</EndProperty>
<Condition ColumnName="StateLocationId" IsNull="false" />
</AssociationSetMapping>
Это тот самый Condition ColumnName="StateLocationId"
, который жалуется, потому что ZipCodeState
ассоциация также этосостояние.
Но я не понимаю. Дискриминаторы для всех сущностей уникальны (я проверил трижды), и я бы подумал, что это правильный сценарий:
- В округе имеется один штат, обозначаемый StateLocationId (таблица местоположений)
- ZipCode имеет одно состояние, обозначаемое StateLocationId (таблица расположений)
Разве это не действует в TPH?