6

Estoy tratando de asignar una jerarquía de herencia TPT en una base de datos heredada (no puedo cambiar los nombres de las columnas). Todos los ejemplos tienen las claves principales de las tablas principal y secundaria con el mismo nombre. Desafortunadamente, el mío no se comporta de esta manera.Asignar TPT en código EF Primero 4.1 con claves primarias diferentes

Como un ejemplo simplificado:

Vehicle 
---------------- 
VehicleId 
Make 
Model 
---------------- 

Car 
---------------- 
CarId   
SomeOtherField 
---------------- 

Carid y IDVehículo son en realidad el mismo ID y son los valores que se deben utilizar para asociar las tablas. ¿Hay algún apoyo para crear esto como una relación TPT en Code First?

Respuesta

3

Here es una declaración sobre este tema por parte del equipo EF:

Desafortunadamente esto no es posible en esta etapa. Me doy cuenta de que esto no es una gran respuesta, pero una opción sería crear una vista que renombre la columna PK/FK y luego asignar a eso.

Es a partir de febrero de 2011. Por lo tanto, estaba relacionado con una versión anterior de CTP EF-Primero. Pero creo que este escenario aún no es compatible con EF 4.1.

también una pregunta similar aquí con que no se ajusten resultado con respecto a EF 4.1 Código-Primera: How can I use TPT inheritance models when primary keys have different names?

+0

Gracias - En realidad, había visto el otro S.O. pregunta y que nunca fue realmente respondida. Supongo que solo esperaba que algo hubiera cambiado ... –

+1

¿Sabes por qué existe este problema? Porque el código primero se desarrolló como "código primero". Todos los artículos iniciales sobre el uso de DbContext con la base de datos existente involucraban a EDMX. Usar un mapeo fluido con una base de datos existente fue algo que sucedió naturalmente, pero creo que no se supuso la mayor parte del tiempo durante el desarrollo. Debido a esto, esta característica nunca fue necesaria porque cuando mapea la herencia del código, solo tiene una propiedad de Id definida en la clase base y dejará que EF haga su trabajo. –

+0

@Ladislav: ¡suena plausible! – Slauma

1

Tengo que esto funcione de la siguiente manera:

  1. Eliminar todas las propiedades de navegación entre la base y heredada objetos.
  2. Elimina la clave foránea de los objetos heredados y también elimina la asignación de propiedades para la clave externa en los objetos heredados.
  3. Eliminar la asignación de tablas en los objetos heredados.
  4. Agregue la opción de identidad generada por la base de datos a la clave primaria de los objetos heredados (si está usando identidad en los PK).
  5. Agregue un mapa para el tipo base al tipo derivado, y (un bit importante) en el mapa mapee explícitamente cada propiedad que no aparece en la clase/tabla base. En el mapa, también correlaciona el tipo derivado con la tabla del tipo derivado.

Eso debería ser suficiente. El enlace es una solución de muestra en EF < -> RIA < -> Silverlight, que también muestra una solución alternativa para una propiedad con un nombre idéntico en los tipos base y derivados (la solución es esencialmente cambiar el nombre de la propiedad en la base tipo o tipos derivados).

http://dotnetdavis.com/upload/content/source.zip

0

He encontrado respuesta para este artículo aquí: http://entityframework.codeplex.com/workitem/2087. Para su caso de que necesite:

  1. en C# define entidad Vehículo (IDVehículo, marca, modelo)
  2. en C# define entidad de coches (SomeOtherField), derivados de la columna de vehículos // Carid se asignarán en IDVehículo, véase más adelante cómo.
  3. En override protected void OnModelCreating (DbModelBuilder modelBuilder) 'hacer esto:

    modelBuilder.Entity() .ToTable ("coche") .property (t => t.VehicleId) .HasColumnName (" CarId ");

Cuestiones relacionadas