13

tengo las siguientes tablas Essence, EssenseSet y Essense2EssenceSetentidad Código Marco Primera muchos a muchos de instalación Para las tablas existentes

Essense2EssenceSet es la tabla de vinculación que crea el M: M relación.

No he podido obtener la relación M: M funcionando aunque en el código EF primero.

Aquí está mi código:

[Table("Essence", Schema = "Com")] 
    public class Essence 
    { 
     public int EssenceID { get; set; } 
     public string Name { get; set; } 
     public int EssenceTypeID { get; set; } 
     public string DescLong { get; set; } 
     public string DescShort { get; set; } 
     public virtual ICollection<EssenceSet> EssenceSets { get; set; } 
     public virtual EssenceType EssenceType { get; set; } 
    } 

    [Table("EssenceSet", Schema = "Com")] 
    public class EssenceSet 
    { 
     public int EssenceSetID { get; set; } 
     public int EssenceMakerID { get; set; } 
     public string Name { get; set; } 
     public string DescLong { get; set; } 
     public string DescShort { get; set; } 

     public virtual ICollection<Essence> Essences { get; set; } 
    } 

[Table("Essence2EssenceSet", Schema = "Com")] 
    public class Essence2EssenceSet 
    { 
     //(PK/FK) 
     [Key] [Column(Order = 0)] [ForeignKey("Essence")] public int EssenceID { get; set; } 
     [Key] [Column(Order = 1)] [ForeignKey("EssenceSet")] public int EssenceSetID { get; set; } 

     //Navigation 
     public virtual Essence Essence { get; set; } 
     public virtual EssenceSet EssenceSet { get; set; } 
    } 
      public class EssenceContext : DbContext 
      { 
       public DbSet<Essence> Essences { get; set; } 
       public DbSet<EssenceSet> EssenceSets { get; set; } 
       public DbSet<Essence2EssenceSet> Essence2EssenceSets { get; set; } 

       protected override void OnModelCreating(DbModelBuilder mb) 
       { 
        mb.Entity<Essence>() 
         .HasMany(e => e.EssenceSets) 
         .WithMany(set => set.Essences) 
         .Map(mc => 
          { 
           mc.ToTable("Essence2EssenceSet"); 
           mc.MapLeftKey("EssenceID"); 
           mc.MapRightKey("EssenceSetID"); 
          }); 
       } 
     } 

Este es el código que estoy tratando de correr:

Essence e = new Essence(); 
          e.EssenceTypeID = (int)(double)dr[1]; 
          e.Name   = dr[2].ToString(); 
          e.DescLong  = dr[3].ToString(); 

          //Get Essence Set 
          int setID = (int)(double)dr[0]; 
          var set = ctx.EssenceSets.Find(setID); 
          e.EssenceSets = new HashSet<EssenceSet>(); 
          e.EssenceSets.Add(set); 
          ctx.Essences.Add(e); 
ctx.SaveChanges(); 

Y aquí está el error:

Se produjo un error al guardar entidades que no exponga las propiedades de clave foránea para sus relaciones. La propiedad EntityEntries devolverá null porque no se puede identificar una sola entidad como el origen de la excepción.

No puedo encontrar el problema. Agradecería mucho ayuda para configurar esto bien. Gracias!

Respuesta

25

Retire su tabla Essence2EssenceSet. Si la tabla de unión contiene solo claves de entidades relacionadas que participan en relaciones de muchos a muchos, no es necesario mapearla como entidad. También asegúrese de que su correspondencia fluida de relaciones muchos a muchos especifica el esquema para la tabla:

mb.Entity<Essence>() 
    .HasMany(e => e.EssenceSets) 
    .WithMany(set => set.Essences) 
    .Map(mc => 
     { 
      mc.ToTable("Essence2EssenceSet", "Com"); 
      mc.MapLeftKey("EssenceID"); 
      mc.MapRightKey("EssenceSetID"); 
     }); 
+0

¡Tiene razón, gracias! Me olvidé del esquema de tabla. ¿Siente que es mala forma exponer la tabla de unión en casos como este cuando no está (cargada) con campos adicionales? – user169867

+0

@Ladislav Mrnka, ¿No hay forma de hacerlo con la definición explícita de la tabla y el uso de DataAnnotations? Me resulta mucho más fácil mantener y comentar mi código usando DataAnnotations en lugar de Fluent Mapping. – Scott

+0

@Scott: no conozco la forma de hacerlo con las anotaciones de datos. Las anotaciones de datos son para los escenarios más simples donde le permite a EF generar la base de datos y no se molesta con su estructura o nomenclatura. –

Cuestiones relacionadas