Cómo configurar una relación de muchos a muchos utilizando la API de la entidad con fluidez

Intento establecer una relación de muchos a muchos en el código EF primero, pero las convenciones predeterminadas son equivocadas. Las siguientes clases describen la relación:

class Product { public int Id { get; set; } public string Name { get; set; } } class Account { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } 

Una cuenta puede tener muchos productos.

Sin embargo, las convenciones EF crearán las tablas DB como:

 Products Table -------------- Id Name Account_Id <- What is this? Accounts Table -------------- Id Name 

Esto no parece una estructura de tablas de muchos a muchos? ¿Cómo puedo configurar la API con fluidez para reflejar la relación y crear una tabla intermedia?

 AccountProducts Table --------------------- Account_Id Product_Id 

 modelBuilder.Entity() .HasMany(a => a.Products) .WithMany() .Map(x => { x.MapLeftKey("Account_Id"); x.MapRightKey("Product_Id"); x.ToTable("AccountProducts"); }); 

Lo que EF ha sugerido es una relación de uno a muchos.

Una cuenta puede tener muchos productos, es decir, cada producto tiene un ID de cuenta

Si quieres una relación de muchos a muchos (y crea una tabla de intermediarios), lo siguiente debería funcionar

 class Product { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Accounts { get; set; } } class Account { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } 

Primero, el código es crear tablas en la forma relacional correcta. Cuando

Una cuenta puede tener muchos productos.

La tabla de productos debe almacenar la clave para su Cuenta, como lo hace ahora.

Lo que estás tratando de ver en db es una relación de muchos a muchos, no de uno a muchos. Si quieres lograr eso con el código primero, debes rediseñar tus entidades

 class Product { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Accounts { get; set; } } class Account { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } 

En este caso, un producto puede tener muchas cuentas y una cuenta puede tener muchos productos.

  public AccountProductsMap() { this.ToTable("AccountProducts"); this.HasKey(cr => cr.Id); this.HasMany(cr => cr.Account) .WithMany(c => c.Products) .Map(m => m.ToTable("AccountProducts_Mapping")); } 
    Intereting Posts