Entity Framework many-to-many relationship

Entity Framework many-to-many relationship

·

2 min read

While optimising a query, I noticed that a many-to-many relationship still used a class in between. There is a more optimised way to configure many-to-many relationships in Entity Framework.

Before, many-to-many relationships looked like:

[Table("dbo.Book")]
public class Book
{
  [Key]
  public int Id { get; set; }
  public virtual ICollection Authors { get; set; }
}
[Table("dbo.BookAuthor")]
public class BookAuthor
{
  [Key]
  public int BookId { get; set; }
  [Key]
  public int AuthorId { get; set; }
}
[Table("dbo.Author")]
public class Author
{
  [Key]
  public int Id { get; set; }
  public virtual ICollection Authors { get; set; }
}

There is a much more compact way of describing it:

[Table("dbo.Person")]
public class Book
{
  [Key]
  public int Id { get; set; }
  public virtual ICollection Authors { get; set; }
}
public class Author {
  [Key]
  public int Id { get; set; }
  public virtual ICollection Books { get; set; }
}
public class MyContext : DbContext
{
  public void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Entity<Author>()
      .HasMany<Order>(a => a.Books)
      .WithMany(b => b.Authors)
      .Map(map =>
          {
            map.MapLeftKey("BookId");
            map.MapRightKey("AuthorId");
            map.ToTable("BookAuthor");
          });
  }
}

The OnModelCreating method will tell Entity Framework to add a many-to-many relationship between the Book and Author table. In the back it will use a link table named BookAuthor. Now, you won't see this little table anymore. One less step to take and to make your code a bit more readable. Just make sure the MapLeftKey and MapRightKey are set correctly, otherwise an existing table will map the wrong items to each other.

Btw, thanks Stack Overflow.