Entity Framework 4 Tabela por hierarquia - Como definir propriedades de navegação em filhos?

Atualmente, tenho um modelo do Entity Framework 4.0 em vigor com Table Per Type (TPT), mas há alguns problemas de desempenho (muitas instruções LOJ / CASE), além de um mapeamento de problemas entre duas áreas de domínio específicas (muitas para muitos).

Eu decidi experimentar o TPH.

Eu tenho uma entidade chamada "Localização" qual éabstratoe a base para todas as outras entidades.

Então eu tenho "País","Cidade","Estado","Rua", etc, todos derivados da Localização.

"Tipo de localização" é odicriminator.

Essa parte está funcionando bem, mas estou tendo problemas ao tentar definir propriedades de navegação para os tipos derivados.

Por exemplo, um "Estado"tem um único"País", então eu devo ser capaz de fazer isso:

var state = _ctx.Locations.OfType<State>().Include("Country").First();
var countryForState = state.Country;

Mas isso exigiria uma propriedade de navegação chamada "País" na entidade derivada de "Estado". Como eu faço isso? Ao gerar o modelo a partir do banco de dados, tenho uma única tabela com todos os FKs apontando para os registros na mesma tabela:

(NOTA: Criei esses FK manualmente no DB).

Mas os FKs são colocados como nav no "Localização"entity, então como movo essas propriedades de navegação para as entidades derivadas? Não posso copiar + colar as navs e não posso" criar nova propriedade de navegação ", porque ela não permite definir o início / fim da função.

Como vamos fazer isso?

Também não está claro no TPH se podemos fazê-lo primeiro no modelo ou se PRECISAMOS começar com um banco de dados, consertar o modelo e gerar novamente o banco de dados. Ainda estou para encontrar um bom exemplo na internet sobre como definir navs em crianças com TPH.

NOTA:Eu não quero fazer primeiro o código. Minha solução atual tem TPT com o EDMX e POCO puro, espero não afetar o modelo de domínio / repositórios (se possível) e apenas atualizar o modelo / banco de dados EF.

EDITAR

Ainda não há solução - por mais que eu esteja tentando fazer o modelo primeiro e fazendo Add -> New Association, o que de fato me permite adicionar uma navegação às entidades derivadas. Mas quando tento "Gerar banco de dados a partir do modelo", ele ainda tenta criar tabelas para "Location_Street", "Location_Country" etc. É quase como se o TPH não pudesse ser feito primeiro com o modelo.

EDITAR

Aqui está o meu modelo atual:

O erro de validação que estou recebendo no momento:

Erro 1 Erro 3002: Problema no mapeamento de fragmentos iniciados na linha 359: Violação em tempo de execução potencial das chaves de Locations da tabela (Locations.LocationId): As colunas (Locations.LocationId) são mapeadas para as propriedades de EntitySet NeighbourhoodZipCode (NeighbourhoodZipCode.Neighbourhood.LocationId) no lado conceitual mas eles não formam as principais propriedades do EntitySet (NeighbourhoodZipCode.Neighbourhood.LocationId, NeighbourhoodZipCode.ZipCode.LocationId).

Apenas pensei em continuar editando esta pergunta com a edição referente a onde estou atualmente. Estou começando a me perguntar se o TPH com FK de auto-referência é possível.

EDITAR

Então, descobri o erro acima, porque estava faltando a tabela de junção para o Neighborhood-ZipCode de muitos para muitos.

Adicionar a tabela de junção (e mapear as navs para isso) resolveu o erro acima.

Mas agora estou recebendo este erro:

Erro 3032: Problema no mapeamento de fragmentos iniciando nas linhas 373, 382: Os membros da condição 'Locations.StateLocationId' têm valores de condição duplicados.

Se eu der uma olhada no CSDL, aqui está o mapeamento da associação para "CountyState" (um estado tem muitos condados, um condado tem 1 estado):

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

É issoCondition ColumnName="StateLocationId" que está reclamando, porqueZipCodeState associação também a esta condição.

Mas eu não entendo. Os discriminadores para todas as entidades são únicos (verifiquei três vezes mais) e eu pensaria que esse era um cenário válido:

O município possui um único Estado, indicado por StateLocationId (tabela de locais)O ZipCode possui um único Estado, indicado por StateLocationId (tabela Locations)

Isso não é válido no TPH?

questionAnswers(1)

yourAnswerToTheQuestion