• EntityFramework 学习 一 Entity Relationships 实体的关系


    下面,我们学习Entity Framework怎么管理实体间的关系

    Entity Framework支持三种关系:一对一的关系、一对多的关系、多对多的关系

    前面我们创建SchoolDB的实体数据模型,下图展示了EDM可视化设计器中的实体和实体关系

     一对一的关系

     上图所示,Student和StudentAddress是一对一的关系,一个学生可以有一个或零个地址,Entity Framework添加Student的导航属性到StudentAddress实体中,添加StudentAddress导航属性到Studnet实体中,StudentAddress实体有StudentId属性作为主键

    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的导航属性,StudentId作为外键

    一对多关系 

     Standard和Teacher实体有一对多的关系,Standard可以有多个Teacher,然而Teacher只有一个Standard

    为了表示这个关系,Standard实体有Teachers的集合导航属性(它是个复数)表明一个Standard可以有很多Teachers。Teacher实体有一个Standard的导航属性(不是集合)表明Teacher与一个Standard关联,它包含StandardId外键(StandardId是Standard实体的主键)

    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实体有Teacher的集合属性,因此它包含多个Teacher对象,(在构造函数中初始化,因此你可以添加Teacher实体,不用担心集合是否初始化)

    Teacher实体包含Standard的导航属性,StandardId作为外键

    多对多的关系

    Student和Course是多对多的关系,一个Student可以选择多门Course,一个Course可以教多个Student

    数据库中的设计StudentCourse表,包含Student和Course表的两个主键,Entity Framework不通过联合表的实体集,

    Student实体中包含Course集合属性,Course实体包含Student的集合属性,

    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; }
    }

     备注:Entity Framework支持多对多的关系,当联合表(StudentCourse)不包含其他列(除了关联两个表的主键外)。如果联合表包含额外的列,例如DateCreated,EDM将给中间表创建实体,你不得不手动管理多对多的CRUD操作。

    打开EDM的Xml文件,你讲看到存储模型有StudentCourse实体集,而概念模型中没有,在MSL(C-S Mapping),它已经实现Student和Course之间的映射

    由此,多对多的关系在EDM中被C-S Mapping管理,当你在Course中添加Student或在Student中添加Course保存到数据库中,它将在StudentCourse表中插入Student和Course的主键

     这种映射不仅使两个实体方便的关联,而且通过这个联合管理查询、添加、更新操作。

    实体图表

     当一个实体与其他实体有关联,对象的所有级层关系通过图表展示出来。例如,下面是Student实体图表,

     

  • 相关阅读:
    设置导航条上的主题一颜色
    luogu_2158【题解】欧拉函数
    luogu_1313【题解】二项式定理
    【数论学习笔记】高斯消元
    luogu_2524【题解】康托展开
    luogu_1495【题解】中国剩余定理
    【数论学习笔记】 约数
    luogu_4430 luogu_4981【题解】 Cayley定理
    【数论学习笔记】质数
    【数论学习笔记】同余
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6597233.html
Copyright © 2020-2023  润新知