Entity Framework Code First 多對多關聯設定

Nov 25, 2014

1 min read

兩個類別之間,各自包含對應的集合導覽屬性,就會被當成多對多關系 在資料庫中的多對多關系,需要用三張表來表示,分別是一對多再多對一

一個使用者可以有多個群組

namespace ConsoleApplication1.Models
{
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
[Table("User")]
public class User
{
    public int UserId { get; set; }

    public string UserName { get; set; }

    public virtual ICollection<Group> Group { get; set; }
}

}

一個群組可以有多個使用者

namespace ConsoleApplication1.Models
{
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
[Table("Group")]
public class Group
{
    public int GroupId { get; set; }

    public string GroupName { get; set; }

    public virtual ICollection<User> User { get; set; }
}

}

預設會自動生成第三張表

[![](http://4.bp.blogspot.com/-Kf0FCZt6HKU/VHQ_vKY2CbI/AAAAAAAABw4/vmkQa6Gjf08/s1600/01.png)](http://4.bp.blogspot.com/-Kf0FCZt6HKU/VHQ_vKY2CbI/AAAAAAAABw4/vmkQa6Gjf08/s1600/01.png)

透過FluentAPI設定第三張表的名稱,和欄位名稱

namespace ConsoleApplication1.Models
{
    using System.Data.Entity;
public class DemoContext : DbContext
{
    public DbSet<User> User { get; set; }

    public DbSet<Group> Group { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(x => x.Group)
            .WithMany(x => x.User)
            .Map(x =>{
                x.ToTable("MyUserGroup");
                x.MapLeftKey("UserID");
                x.MapRightKey("GroupID");
            });
    }
}

}

資料表建立的樣子

[![](http://2.bp.blogspot.com/-pPz9en0LdGs/VHRB1DkAGRI/AAAAAAAABxE/bn58i66WkR0/s1600/03.png)](http://2.bp.blogspot.com/-pPz9en0LdGs/VHRB1DkAGRI/AAAAAAAABxE/bn58i66WkR0/s1600/03.png)
關聯圖
[![](http://2.bp.blogspot.com/-ge9m8hgR2NE/VHRCAxbu4CI/AAAAAAAABxM/dWik0q60CHA/s1600/04.png)](http://2.bp.blogspot.com/-ge9m8hgR2NE/VHRCAxbu4CI/AAAAAAAABxM/dWik0q60CHA/s1600/04.png)

Sharing is caring!