原文鏈接:https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx 這裡,我們將學習如何在Student實體和Course實體間配置多對多關係,S ...
這裡,我們將學習如何在Student實體和Course實體間配置多對多關係,Student可以參加很多Courses,並且多個學生可以加入同一個Course。
可以看下這篇文章, Entity Relationship 瞭解一下EF是如何管理實體間的一對一,一對多以及多對多關係的。
通過預設約定配置多對多關係
EF 6包含多對多關係的預設約定,你需要在兩個實體間都包含集合類型的導航屬性。例如:Student類應該包含一個集合類型的導航屬性Course,同樣Course類也應該包含一個集合類型的導航屬性Student:
public class Student
{
public Student()
{
this.Courses = new HashSet<Course>();
}
public int StudentId { get; set; }
[Required]
public string StudentName { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
public Course()
{
this.Students = new HashSet<Student>();
}
public int CourseId { get; set; }
public string CourseName { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
下麵的上下文類中,包含Student和Course實體:
public class SchoolDBContext : DBContext
{
public SchoolDBContext() : base("SchoolDB-DataAnnotations")
{
}
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
EF API將會創建Students表和Courses表,同樣還會創建聯接表StudentCourses,StudentCourses表中,包含兩個表中的主鍵作為主鍵以及外鍵:
enter description here
註意:聯接表的名稱就是兩個實體名稱+尾碼s.
使用Fluent API配置多對多關係
上面的例子中,你已經看到了預設的約定為我們創建了多對多關係的表,以及相關的聯接表。我們可以使用FLuent API來配置連接表的名稱和列。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasMany<Course>(s => s.Courses)
.WithMany(c => c.Students)
.Map(cs =>
{
cs.MapLeftKey("StudentRefId");
cs.MapRightKey("CourseRefId");
cs.ToTable("StudentCourse");
});
}
上面的代碼中,HasMany()方法和WithMany()方法,用來給Student和Course實體配置多對多關係。Map()方法包含一個Action類型的委托,這裡我們傳入lambda,來定製聯接表。MapLeftKey()用來指定Student表中的主鍵名稱(因為我們從Student實體開始配置,所以Student是左表),MapRightKey()用來配置Course表中的主鍵名稱,ToTable用來指定聯接表的名稱。
enter description here
這樣你就通過Fluent API重寫了預設約定,配置了多對多關係。