13.翻译系列:Code-First方式配置多对多关系【EF 6 Code-First系列】
原文链接:
这里,我们将学习如何在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表中,包含两个表中的主键作为主键以及外键:
注意:联接表的名称就是两个实体名称+后缀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用来指定联接表的名称。
这样你就通过fluent api重写了默认约定,配置了多对多关系。
上一篇: 与警察的合影技巧
下一篇: 2022年必火的4个线下创业项目