Many to Many relationships in Code First

El mejor modo de configurar las relaciones “Many to  Many” en code first es usando fluent API, con fluent API podemos hacer cualquier configuración en nuestro modelo cosa que no podemos hacer con las convenciones de atributos.

No es  que no crea que los atributos no son útiles, que realmente lo son, sino que es ocasiones y para determinadas configuraciones es mejor y más sencillo usar fluent api.

Partiendo por  ejemplo de 2 clases “Customer” y “Video”, en un escenario en el que un “Customer” puede haber alquilado varios “Videos” y un mismo video puede haber sido alquilado por varios “Customers”. Cada clase tendría las siguientes propiedades de navegación:

  1. public class Customer
  2. {
  3.     [Key]
  4.     public int CustomerId { get; set; }
  5.     public virtual ICollection<Video> Videos { get; set; }
  6. }
  7. public class Video
  8. {
  9.     [Key]
  10.     public int VideoId { get; set; }
  11.     public virtual ICollection<Customer> Customers { get; set; }
  12. }

En nuestra clase de definición del contexto podemos usar el objeto “ModelBuilder” de Fluent API:

  1. public class VideoClubContext : DbContext
  2. {
  3.     public DbSet<Customer> Customers { get; set; }
  4.     public DbSet<Video> Videos { get; set; }
  5.     //Sobreescribimos el mtodo OnModelCreating que nos da acceso al Objeto ModelBuilder.
  6.     protected override void OnModelCreating(DbModelBuilder modelBuilder)
  7.     {
  8.         modelBuilder.Entity<Customer>()
  9.                 .HasMany(customer => customer.Videos)
  10.                 .WithMany(video => video.Customers)
  11.                 .Map(t =>
  12.                 {
  13.                     t.ToTable("VideoHistory");
  14.                     t.MapRightKey("VideoId");
  15.                     t.MapLeftKey("CustomerId");
  16.                 });
  17.     }
  18. }

Y voila, cuando ejecutemos nuestra aplicación, y dependiendo de nuestra configuración de “Migrations”, se creará en nuestra base de datos una tabla “Customers”, una  tabla “Videos” y una tercera tabla “VideoHistory” con las columnas: “CustomerId” y “VideoId” configuradas como foreingKeys de “Customers” y “Videos”.


Por favor no dejéis de leer los libros de Julie Lerman “Programming Entity Framework: Code First” y “Programming Entity Framework: DbContext”, ambos de O’reilly.

Os ayudarán muchísimo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *