EF 6 Code-First系列文章目錄:typescript
這裏,咱們將學習如何在Student實體和Course實體間配置多對多關係,Student能夠參加不少Courses,而且多個學生能夠加入同一個Course。數據庫
能夠看下這篇文章, Entity Relationship 瞭解一下EF是如何管理實體間的一對一,一對多以及多對多關係的。api
EF 6包含多對多關係的默認約定,你須要在兩個實體間都包含集合類型的導航屬性。例如:Student類應該包含一個集合類型的導航屬性Course,一樣Course類也應該包含一個集合類型的導航屬性Student:app
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實體:ide
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表中,包含兩個表中的主鍵做爲主鍵以及外鍵:學習
注意:聯接表的名稱就是兩個實體名稱+後綴s.測試
上面的例子中,你已經看到了默認的約定爲咱們建立了多對多關係的表,以及相關的聯接表。咱們能夠使用FLuent API來配置鏈接表的名稱和列。ui
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用來指定聯接表的名稱。this
這樣你就經過Fluent API重寫了默認約定,配置了多對多關係。