Herencia de tabla por tipo con código de fluidez de EF 4.1 primero

entity-framework entity-framework-4 entity-framework-4.1 entity-framework-6 table-per-type

Pregunta

Tengo un conjunto bastante sencillo de tablas de bases de datos, como:

Vehicle
 Id
 RegNo

Car
 Id (FK of Vehicle.Id)
 OtherStuff

Bike
 Id (FK of Vehicle.Id)
 MoreStuff

Mi modelo de clase es el que usted esperaría: el Vehículo es una clase abstracta, y luego el Coche y la Bicicleta son subclases de él.

He configurado mi configuración de Código EF4.1 Primero de la siguiente manera:

Vehicle
 Id
 RegNo

Car
 Id (FK of Vehicle.Id)
 OtherStuff

Bike
 Id (FK of Vehicle.Id)
 MoreStuff

Sin embargo, estoy recibiendo numerosas excepciones extrañas cuando EF intentó construir su configuración de modelo.

Actualmente está tirando esto:

Vehicle
 Id
 RegNo

Car
 Id (FK of Vehicle.Id)
 OtherStuff

Bike
 Id (FK of Vehicle.Id)
 MoreStuff

¿De dónde viene ese nombre de columna? No está en ninguno de mi código o la base de datos en sí. Debe ser alguna convención que se haga cargo del control. ¿Cómo le ordeno a EF que use una tabla por tipo?

Si elimino la palabra clave "abstracta" de mi clase de Vehículo (que hice como una prueba de cordura en algún punto de la línea), obtengo una excepción diferente, como la siguiente:

Vehicle
 Id
 RegNo

Car
 Id (FK of Vehicle.Id)
 OtherStuff

Bike
 Id (FK of Vehicle.Id)
 MoreStuff

Obviamente estoy haciendo algo terriblemente mal, pero ¿qué? ¡He seguido los documentos de MSDN y todos los demás artículos de TPT + EF4.1 que puedo encontrar!

Respuesta popular

Cuando tuve este problema, descubrí que tenía una subclase que no estaba asignada. En este ejemplo, algunas causas posibles de esto son:

  1. Existe una subclase adicional, como Bus . Esto no está mapeado
  2. Una de las subclases, como Car , no está asignada.

En este caso, asegúrese de que cada subclase se asigna:

  1. Asegúrese de que exista una asignación para la subclase, incluida una ToTable método ToTable .
  2. Asegúrese de que la asignación se esté aplicando realmente durante OnModelCreating .
  3. Si tiene problemas para rastrear esto, intente usar un depurador y establecer puntos de interrupción en todo el código de asignación.

Alternativamente, si la subclase no se debe asignar en primer lugar, asegúrese de ignorarla utilizando una de las llamadas al método Ignore .




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué