欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

13.翻译系列:Code-First方式配置多对多关系【EF 6 Code-First系列】

程序员文章站 2022-06-10 08:57:25
原文链接: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表中,包含两个表中的主键作为主键以及外键:

 

13.翻译系列:Code-First方式配置多对多关系【EF 6 Code-First系列】
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用来指定联接表的名称。

 

13.翻译系列:Code-First方式配置多对多关系【EF 6 Code-First系列】
enter description here

 

这样你就通过fluent api重写了默认约定,配置了多对多关系。