zoukankan      html  css  js  c++  java
  • EF中的实体关系

    导航属性的理解:

    指数据库的表所对应的实体类,除了要有每个字段所对应的属性之外,还应该有一个与之有关联的表的属性,一对一的关系就是关联表的类型,一对多的关系就是关联表的类型的ICollection的泛型集合。(结合下面例子理解)

    1.一对一关系类型

    上图中Student和StudentAddress是一对一(零)的关系,一个学生只能有一个或零个地址。

    实体框架将Student实体导航属性添加到StudentAddress实体中,将StudentAddress实体导航属性添加到Student实体中。

    StudentAddress类中的StudentID既是PrimaryKey(主键),也是Student类的ForeignKey(外键)。

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

    2.一对多关系类型

    Teacher和Course是一对多的关系。(一个老师可能教多门课程,一门课程只能由一个老师教)

    Standard与Teacher实体具一对多的关系。(一个评分级别可能赋予多个老师,一个老师只能有一个评分)

    public partial class Standard
    {
        public Standard()
        {
            this.Teachers = new HashSet<Teacher>();
        }
        
        public int StandardId { get; set; }
        public string StandardName { get; set; }
        public string Description { 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> TeacherType { get; set; }
        //外键
        public Nullable<int> StandardId { get; set; }
        //实体导航属性
        public virtual Standard Standard { get; set; }
    }

    Standard实体具有集合导航属性 Teachers (请注意它是复数),Teacher中StandardId是Standard的外键。

    3.多对多关系类型

    Student和Course具有多对多关系。这表示一个学生可以参加许多课程,而一个课程也可以向许多学生讲授。

    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 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 virtual ICollection<Student> Students { get; set; }
    }

    这两个类都有集合导航属性。

    注:实体框架在中间表仅有两个表的主键(只有StudentId和CourseId)时才自动维护多对多关系。当我们给Student添加一个Course或给Course添加一个Student,执行SaveChange()时,EF会在中间表自动会插入对应的StudentId和CourseId。如果中间表包含其他列,那么EDM也会为中间表创建实体,EF不再自动维护中间表,那么我们就需要手动管理多对多实体的CRUD操作。

  • 相关阅读:
    JS中字符串的true转化为boolean类型的true
    jquery select change下拉框选项变化判断选中值
    C# 使用 NPOI 库读写 Excel 文件
    通过微信分享链接,后面被加上from=singlemessage&isappinstalled=1导致网页打不开
    C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
    SQL查询语句如何能够让指定的记录排在最后
    搞懂 JavaScript 继承原理
    基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
    SqlServer 使用sys.dm_tran_locks处理死锁问题
  • 原文地址:https://www.cnblogs.com/linybo/p/13260295.html
Copyright © 2011-2022 走看看