2011-05-13 12 views
10

Estoy intentando usar primero el código y la API para crear un objeto que contenga dos entidades diferentes de la misma tabla. En otras palabras, un objeto de transferencia contiene una referencia a dos objetos de tanque diferentes: uno es la fuente y el otro el destino.Asociaciones múltiples de un objeto a dos objetos de la misma entidad Tipo

Sin embargo, cuando uso el siguiente código obtengo una Excepción que indica que "La relación referencial dará como resultado una referencia cíclica que no está permitida".

modelBuilder.Entity<Transfer>() 
      .HasRequired<Tank>(t => t.Source) 
      .WithMany(t => t.OutboundTransfers); 
modelBuilder.Entity<Transfer>() 
      .HasRequired<Tank>(t => t.Destination) 
      .WithMany(t => t.InboundTransfers); 

Mi mejor estimación es que cree que estoy apuntando ambas teclas al mismo tanque? ¿Alguna idea de cómo puedo lograr esto?

EDIT: encontrado la respuesta como la adición de .WillCascadeOnDelete (falsa) de Entity Framework Code First - two Foreign Keys from same table

+2

Sí, no puede dejar que EF 4.1 habilite las restricciones de eliminación en cascada cuando dos propiedades de navegación apuntan a la misma tabla. para habilitar las restricciones adecuadas, deberá agregarlas manualmente en la base de datos utilizando los objetos Seeding para ejecutar los scripts adecuados. –

+0

Eso es todo, como lo han encontrado y como también señaló Alexandre. Hacerlo manualmente en el MSSMS arroja el error "No se puede crear la relación (...) puede causar ciclos o múltiples rutas en cascada. Especifique EN ELIMINAR SIN ACCIÓN o EN ACTUALIZAR SIN ACCIÓN, o modificar otras restricciones de LLAVE EXTRAÑA". –

+1

¿Puede agregar su solución como respuesta y marcarla? – sinelaw

Respuesta

1

Como usted dijo, usted debe ser capaz de añadir .WillCascadeOnDelete(false) - https://stackoverflow.com/a/5559300/5416

modelBuilder.Entity<Transfer>() 
     .HasRequired<Tank>(t => t.Source) 
     .WithMany(t => t.OutboundTransfers) 
     .WillCascadeOnDelete(false); 
modelBuilder.Entity<Transfer>() 
     .HasRequired<Tank>(t => t.Destination) 
     .WithMany(t => t.InboundTransfers) 
     .WillCascadeOnDelete(false); 

Acabo de añadir esta respuesta de manera que ya no aparece en la lista sin respuesta como sin respuesta con cero respuestas. Marcado como wiki de la comunidad :)

0

Como de costumbre, Ladislav (EF Guru) tiene la respuesta a las preguntas de EF. (gracias Ladislav) Solo una alternativa he encontrado útil. Tengo una segunda solución que corro en paralelo. Si tengo un primer problema con el código. Primero intenté thi: El ingeniero de reversa para codificar la primera solución. (De las herramientas eléctricas de EF)

Tengo un DB de prueba donde agrego el concepto requerido a mano en un DB. Todavía encuentro que hacer esto en el DB es más intuitivo ya que soy el primero en codificar. Luego, utilizando el powertool http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

en el Proyecto/Solución clic derecho marco de la entidad, realizar ingeniería inversa DB para codificar en primer lugar.

Echa un vistazo al código it generartes. obtienes un ejemplo de cómo hacer algunas cosas.

Cuestiones relacionadas