(TPH), если TPH переходит к одной и той же таблице, TPT переходит к другой. Стоимость операции JOIN одинакова (я думаю). Моя главная проблема в том, что я не вижу смысла в большом количестве обнуляемых ФК
тоящее время у меня есть модель Entity Framework 4.0 с табличным типом (TPT), но есть несколько проблем с производительностью (много операторов LOJ / CASE), а также сопоставление проблем между двумя конкретными областями домена (много-к-одному). много).
Я решил попробовать TPH.
У меня есть сущность под названием "Место нахождения" которыйАннотацияи база для всех остальных лиц.
Тогда яСтрана","город","государственный","улица"и т. д., которые все происходят из местоположения.
"LocationType" этоdicriminator.
Эта часть работает нормально, но у меня возникают проблемы при попытке определить навигационные свойства для производных типов.
Например, "государственный"есть сингл"Страна", поэтому я должен быть в состоянии сделать это:
var state = _ctx.Locations.OfType<State>().Include("Country").First();
var countryForState = state.Country;
Но для этого потребуется навигационное свойство «Страна» в производном объекте «Государство». Как мне это сделать? Когда я генерирую модель из базы данных, у меня есть одна таблица со всеми FK, указывающими на записи в той же таблице:
(ПРИМЕЧАНИЕ: я создал эти FK вручную в БД).
Но FK размещены как навигация на "Место нахождения"сущность, так как я могу переместить эти навигационные свойства вниз к производным сущностям? Я не могу скопировать + вставить навигационные элементы поперек, и я не могу" создать новое навигационное свойство ", потому что это не позволит мне определить начало / конец роли.
как нам это сделать?
С TPH также неясно, можем ли мы сделать это сначала на модели, или мы ДОЛЖНЫ начать с БД, исправить модель, а затем заново сгенерировать БД. Мне еще предстоит найти хороший пример в Интернете о том, как определить навигацию для детей с ТПГ.
НОТА:Я не хочу делать код первым, Мое текущее решение имеет TPT с EDMX и чистые POCO, я надеюсь не повлиять на модель / репозитории домена (если возможно), а просто обновить модель / базу данных EF.
РЕДАКТИРОВАТЬ
По-прежнему нет решения - однако я пытаюсь сделать сначала модель и делать Add -> New Association, что фактически позволяет мне добавить навигацию к производным объектам. Но когда я пытаюсь «Сгенерировать базу данных из модели», он все еще пытается создать таблицы для «Location_Street», «Location_Country» и т. Д. Это почти так же, как TPH не может быть сначала сделан моделью.
РЕДАКТИРОВАТЬ
Вот моя текущая модель:
Ошибка проверки, которую я сейчас получаю:
Ошибка 1 Ошибка 3002. Проблема при отображении фрагментов, начинающихся со строки 359. Потенциальное нарушение времени выполнения таблицы. Ключи Locations (Locations.LocationId): Столбцы (Locations.LocationId) сопоставляются со свойствами EntitySet NeighbourhoodZipCode (NeighbourhoodZipCode.Neighbourhood.LocationDirect). но они не формируют ключевые свойства EntitySet (NeighbourhoodZipCode.Neighbourhood.LocationId, NeighbourhoodZipCode.ZipCode.LocationId).
Просто подумал, что продолжу редактировать этот вопрос с правками относительно того, где я сейчас нахожусь. Я начинаю задаваться вопросом, возможна ли даже ТПХ с самообращающимися ФК.
РЕДАКТИРОВАТЬ
Таким образом, я понял вышеупомянутую ошибку, потому что мне не хватало таблицы соединений для Neighbourhood-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?