(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?

Ответы на вопрос(1)

Ваш ответ на вопрос