Entity Framework Core配置对象之间一对多关系

在上一章中,您了解了将实体映射到数据库的不同对象的EF约定。在这里,您将了解两个实体类之间的关系约定,这些约定会导致数据库中相应表之间的一对多关系。

Entity Framework Core  遵循与 Entity Framework 6.x相同的约定,用于一对多关系。唯一的区别是EF Core创建了一个与导航属性名称相同的外键列,而不是<NavigationPropertyName>_<PrimaryKeyPropertyName>

让我们来看看不同的约定自动配置以下之间的一个一对多的关系StudentGrade实体。

public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
}
       
public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }
}

在上述实体中应用一对多关系的约定后,for StudentGradeentities 的数据库表将如下所示,其中Students表包含外键GradeId

Entity Framework Core配置对象之间一对多关系 1

约定 1

我们希望建立一对多的关系,许多学生与一个年级相关联。这可以通过在从属实体中包括引用导航属性来实现,如下所示。(此处,Student实体是从属实体,Grade实体是主体)。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
   
    public Grade Grade { get; set; }
}

public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }
}

在上面的示例中,Student实体类包括Grade类型的引用导航属性。这允许我们将它们链接Grade到许多不同的Student实体,这在它们之间创建了一对多的关系。这将在数据库中的表StudentsGrades表之间产生一对多的关系,其中Studentstable包含可以为空的外键GradeId,如下所示。EF Core将为GradeId概念模型中指定的外键创建一个shadow属性,该外键将映射到表中的GradeId外键列Students

Entity Framework Core配置对象之间一对多关系 2

注意:引用属性Grade是可空的,因此它GradeIdStudents表中创建一个可为空的ForeignKey 。您可以使用Fluent API配置NotNull外键。

约定 2

另一个约定是在主体实体中包含集合导航属性,如下所示。

public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
}

public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }

    public List<Student> Students { get; set; } 
}

在上面的示例中,Grade实体包含类型的集合导航属性List<student>。这将允许我们向Student实体添加多个Grade实体,这导致数据库中的表StudentsGrades表之间的一对多关系,与约定1中的相同。

约定 3

一对多关系的另一个EF约定是在两端包含导航属性,这也将导致一对多关系(约定1 +约定2)。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    
    public Grade Grade { get; set; }
}

public class Grade
{
    public int GradeID { get; set; }
    public string GradeName { get; set; }
    
    public List<Student> Students { get; set; }
}

在上面的例子中,Student实体包括的参考导航属性Grade类型和Grade实体类包括收集导航属性List<Student>,这导致相应的数据库中的表之间的一对多的关系StudentsGrades,与约定1相同。

约定 4

使用从属实体中的外键属性在两端完全定义关系会创建一对多关系。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int GradeId { get; set; }
    public Grade Grade { get; set; }
}

public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }

    public List<Student> Students { get; set; }
}

在上面的示例中,Student实体包括GradeId类型的外键属性int及其引用导航属性Grade。在另一端,Grade实体还包括集合导航属性List<Student>。这将与表中的NotNull外键列创建一对多关系Students,如下所示。

Entity Framework Core配置对象之间一对多关系 3

如果要将外键设置GradeId为可为空,则使用nullable int data type(Nullable<int> or int?),如下所示。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int? GradeId { get; set; } 
    public Grade Grade { get; set; }
}

因此,这些是在相应的数据库表中自动创建一对多关系的约定。如果实体不遵循上述约定,则可以使用Fluent API配置一对多关系。

User Review
0 (0 votes)
本站最新优惠

Namesilo优惠:新用户省 $1 域名注册-优惠码:45D%UYTcxYuCloZ 国外最便宜域名!点击了解更多

特别优惠:免费赠送 $100 Vultr主机-限时优惠!英文站必备海外服务器!点击了解更多

VPS优惠:搬瓦工优惠码:BWH3OGRI2BMW 最高省5.83%打开外面世界的一款主机点击了解更多

原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2019/26934.html

扫码关注【江湖人士】公众号,您会获得关于国外被动收入的最新资讯

WA付费会员QQ群:387027533,加这个群需要回答您的WA会员名,待核实后予以通过

普通QQ交流群:178758794,可分享交流建站的各类经验和知识

发表评论

电子邮件地址不会被公开。 必填项已用*标注

15 − 7 =