Entity Framework 4 Tabla por jerarquía: ¿cómo definir las propiedades de navegación en los niños?

Actualmente tengo un modelo de Entity Framework 4.0 con Tabla por tipo (TPT), pero hay algunos problemas de rendimiento (muchas declaraciones de LOJ / CASE), así como un mapeo de problemas entre dos áreas de dominio particulares (muchas a muchos).

He decidido probar TPH.

Tengo una entidad llamada "Ubicación" cual esresumen, y la base para todas las demás entidades.

Entonces tengo "País","Ciudad","Estado","Calle", etc., que se derivan de la ubicación.

"Tipo de ubicacion" es eldicriminador.

Esa parte funciona bien, pero tengo problemas para tratar de definir las propiedades de navegación para los tipos derivados.

Por ejemplo, un "Estado"tiene un solo"País", así que debería poder hacer esto:

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

Pero esto requeriría una propiedad de navegación llamada "País" en la entidad derivada de "Estado". ¿Cómo hago esto? Cuando genero el modelo a partir de la base de datos, tengo una sola tabla con todos los FK apuntando a registros en la misma tabla:

(NOTA: Creé esos FK manualmente en la base de datos).

Pero los FK se colocan como navegación en el "Ubicación"entidad, entonces, ¿cómo muevo estas propiedades de navegación a las entidades derivadas? No puedo copiar y pegar los navegadores, y no puedo" crear una nueva propiedad de navegación ", porque no me permite definir el inicio / Fin de la función.

Cómo hacemos esto?

Tampoco está claro con TPH si podemos hacerlo primero en el modelo, o tenemos que comenzar con una base de datos, arreglar el modelo y luego volver a generar la base de datos. Todavía tengo que encontrar un buen ejemplo en Internet sobre cómo definir navegaciones en niños con TPH.

NOTA:No quiero hacer código primero. Mi solución actual tiene TPT con EDMX y POCO puro, espero no afectar el modelo de dominio / repositorios (si es posible) y simplemente actualizar el modelo / base de datos de EF.

EDITAR

Todavía no hay solución, sin embargo, estoy tratando de hacer primero el modelo y haciendo Agregar -> Nueva asociación, lo que de hecho me permite agregar un navegador a las entidades derivadas. Pero cuando intento "Generar base de datos a partir del modelo", todavía intenta crear tablas para "Location_Street", "Location_Country", etc. Es casi como si TPH no se puede hacer primero con el modelo.

EDITAR

Aquí está mi modelo actual:

El error de validación que estoy recibiendo actualmente:

Error 1 Error 3002: Problema en la asignación de fragmentos a partir de la línea 359: violación potencial de tiempo de ejecución de la tabla Las claves de ubicaciones (Locations.LocationId): las columnas (Locations.LocationId) se asignan a las propiedades de EntitySet NeighbourhoodZipCode (NeighbourhoodZipCode.Neighbourhood.LocationId) en el lado conceptual pero no forman las propiedades clave del EntitySet (NeighbourhoodZipCode.Neighbourhood.LocationId, NeighbourhoodZipCode.ZipCode.LocationId).

Solo pensé que seguiría editando esta pregunta con edición sobre dónde estoy actualmente. Estoy empezando a preguntarme si TPH con FK autorreferenciada es incluso posible.

EDITAR

Así que descubrí el error anterior, eso fue porque me faltaba la tabla de unión para el código postal de Neighborhood de muchos a muchos.

Agregar la tabla de unión (y mapear las navegaciones a eso) resolvió el error anterior.

Pero ahora estoy recibiendo este error:

Error 3032: Problema en la asignación de fragmentos que comienzan en las líneas 373, 382: Los miembros de condición 'Locations.StateLocationId' tienen valores de condición duplicados.

Si eche un vistazo al CSDL, aquí está el mapeo de asociación para "CountyState" (un estado tiene muchos condados, un condado tiene 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>

Es esoCondition ColumnName="StateLocationId" que se queja porqueZipCodeState asociación también esta condición.

Pero no lo entiendo. Los discriminadores para todas las entidades son únicos (he verificado tres veces), y habría pensado que este era un escenario válido:

El condado tiene un solo estado, denotado por StateLocationId (tabla de ubicaciones)ZipCode tiene un solo estado, denotado por StateLocationId (tabla de ubicaciones)

¿Eso no es válido en TPH?

Respuestas a la pregunta(1)

Su respuesta a la pregunta