Many to many relationships in Code First. sobre la misma entidad

En muchos modelos se necesitan relaciones muchos a muchos sobre la misma entidad. Esto que parece algo más complicado, es realmente muy sencillo. Pero hay que hacer uso de Fluent API para configurar las foreignKeys.

Normalmente se necesita para establecer jerarquía entre objetos del mismo tipo (entidad). En el siguiente ejemplo vamos a definir un jerarquía de categorías en la que un categoría puede tener varias categorías hija y a su vez pertenecer a varias categorías padre.

Primero definimos nuestra clase “Category” con 2 propiedades de navegacion a si misma.

  1. public partial class Category
  2. {
  3.     [Key]
  4.     public int CategoryId { get; set; }
  5.     [Required, MaxLength(100)]
  6.     public virtual string Name { get; set; }
  7.     public virtual ICollection<Category> ParentCategories { get; set; }
  8.     public virtual ICollection<Category> ChildCategories { get; set; }
  9. }

Creamos la propieda del contexto para nuestra entidad.

  1. public DbSet<Category> Categories { get; set; }

 

public DbSet<Category> Categories { get; set; }

Una vez definida la entidad y las propiedades de navegación, dentro de la clase del contexto sobreescribimos el método OnModelCreating que nos da acceso al objeto ModelBuilder que usaremos para personalizar nuestro modelo a través Fluent API.

Muy importante es establecer correctamente las claves de los extremos de la relación. “Left” corresponde a la clave para la propiedad que establecemos en el método “HasMany” y el mapeo de la clave “Right” corresponde a la clave para la propiedad del método “WithMany”.

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  2. {
  3.     //Catalog and categories
  4.     modelBuilder.Entity<Category>().HasMany(c => c.ParentCategories)
  5.     .WithMany(a => a.ChildCategories)
  6.     .Map(t =>
  7.         {
  8.             t.ToTable("Catalog");
  9.             t.MapLeftKey("ChildCategoryId");
  10.             t.MapRightKey("ParentCategoryId");
  11.  
  12.         });
  13. }

Y voila, si tenemos activado la opcion de Migrations nos actualizará nuestra base de datos con 2 tablas: la primera con nombre “Category” para las entidades y una segunda tabla “Catalog” que mantiene la relación con las correspondientes foreignKeys.

Espero  que os valga, como véis ha sido muy sencillo.

Deja un comentario

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