Skip to main content

Command Palette

Search for a command to run...

Entity Framework many-to-many relationship

Published
2 min read
Entity Framework many-to-many relationship

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.

More from this blog

K

Ken Bonny's dotnet, Azure, architecture and feature testing focussed blog

149 posts

Software craftsman specialising in Microsoft technology (mainly dotnet and Azure)