one many intermediate framework foreign first data code c# entity-framework-4.1 ef-code-first associations

c# - intermediate - entity framework one to many



Cómo configurar la relación de muchos a muchos usando la API fluida del marco de la entidad (4)

El código primero es crear tablas en 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 uno a muchos. Si quiere lograr eso con el código primero, debe rediseñar sus entidades

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

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

Estoy tratando de configurar una relación de muchos a muchos en el código EF primero, pero las convenciones predeterminadas son las incorrectas. 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<Product> Products { get; set; } }

Una cuenta puede tener muchos productos.

Sin embargo, las convenciones de 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 tabla de muchos a muchos? ¿Cómo puedo configurar la API fluida para reflejar la relación y crear una tabla intermedia?

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


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

Una cuenta puede tener muchos productos, es decir, cada producto tiene una Account_Id

Si desea una relación de muchos a muchos (y cree una tabla intermedia), lo siguiente debería funcionar

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


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")); }


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