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重写了默认约定,配置了多对多关系。