猿教程 Logo

实体关系

在这里,您将了解实体框架如何管理实体之间的关系。

实体框架像关系数据库一样,支持三种类型的关系:1)一对一2)一个多,3)多对多。

我们在之前的课程中已经创建了一个SchoolDB数据库的实体数据模型。 下图显示EDM的实体和它们之间的关系。


让我们来看看实体框架是如何来管理每个关系的。


一对一的关系

正如你在上面的图中所看到的,学生和StudentAddress有一个一对一的关系(0或1)。 一个学生只能有一个或零个地址。 实体框架将Student导航属性添加到StudentAddress实体,将StudentAddress导航属性添加到Student实体。 此外,StudentAddress实体有StudentId作为唯一值来保持一对一的关系。

下面的代码片段显示了Student和StudentAddress实体类。

public partial class Student
{
    public Student()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public byte[] RowVersion { get; set; }
    
    public virtual Standard Standard { get; set; }
    public virtual StudentAddress StudentAddress { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}
    
public partial class StudentAddress
{
    public int StudentID { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    
    public virtual Student Student { get; set; }
}

正如你在上面的代码中所看到的Student实体类包括StudentAddress导航属性,StudentAddress包括Student导航属性。 EF就是使用这种方式来处理实体之间的一对一的关系。


一对多的关系

Standard和Teacher实体有个一对多关系的多重性,1表示一个,*表示多个。 这意味着标准可以有许多老师,而老师可以将只有一个标准。

为了表示这种关系,Standard类有一个ICollection

下面的代码片段显示了EDM创建的Standard和Teacher实体类。

public partial class Standard
{
    public Standard()
    {
        this.Students = new HashSet<Student>();
        this.Teachers = new HashSet<Teacher>();
    }
    
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    public string Description { get; set; }
    
    public virtual ICollection<Student> Students { get; set; }
    public virtual ICollection<Teacher> Teachers { get; set; }
}
public partial class Teacher
{
    public Teacher()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int TeacherId { get; set; }
    public string TeacherName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public Nullable<int> TeacherType { get; set; }
    
    public virtual ICollection<Course> Courses { get; set; }
        
    public virtual Standard Standard { get; set; }
}

正如你在上面的代码片段中所看到的, standard实体类有个ICollection<Teacher>类型的属性,所以它可以包含多个老师对象。 (这个属性在构造函数中初始化为HashSet<Teacher>,这样你就可以直接将老师对象添加到该集合中而不用担心它的初始化。)

同时,Teacher实体类包括Standard类型的属性和StandardId外键属性。 

实体框架通过这种方法来实现实体间一对多的关系。


多对多关系

学生和课程有个多对多关系的多重性。 这意味着,一个学生可以进入许多课程,一门课可以教很多学生。

数据库设计上StudentCourse加入两个表的主键(学生和课程表)。 实体框架表示多对多关系,没有entityset CSDL加入表,而是管理映射。

正如你在上面的图中所看到的,学生实体包括课程属性并且课程实体包括学生属性来表示它们之间的多对多关系。

下面的代码片段显示了学生和课程实体类。

public partial class Student
{
    public Student()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public byte[] RowVersion { get; set; }
    
    public virtual Standard Standard { get; set; }
    public virtual StudentAddress StudentAddress { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}
    
public partial class Course
{
    public Course()
    {
        this.Students = new HashSet<Student>();
    }
    
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public System.Data.Entity.Spatial.DbGeography Location { get; set; }
    public Nullable<int> TeacherId { get; set; }
    
    public virtual Teacher Teacher { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}


注意: 实体框架只有在关联表中只包含两个多对多关系表的外键时才支持多对多关系。 如果关联表包含额外的列,你将不得不手动管理多对多实体的CRUD操作。

打开EDM XML视图。 你可以看到SSDL StudentCourse entityset,但CSDL没有StudentCourse entityset。 相反,它被映射在学生和课程实体的导航属性。


因此,多对多关系是通过EDM的c-s Mapping来管理的。 所以当你在课程中添加一个学生或在学生中添加一个课程并保存它时,它会往StudentCourse表中添加学生和课程的主键。 所以这个映射不仅简化了两个实体之间的直接关联,而且便于管理查询,插入,更新。


实体图

由于一个实体与其他实体可能有对应的关系,一个完整的对象层次结构称为一个“实体图”。 例如下面的Student实体的视图图,下面是一个学生,其中包含一个Standard、一个StudentAddress,多个Course。而一个Course又对应一个Teacher。



我们将在下一节了解这些实体的生命周期。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/entity-relations.html