文档章节

9.7 翻译系列:EF数据注解特性之--InverseProperty【EF 6 Code-First系列】

o
 osc_gu9d45li
发布于 2019/04/09 15:33
字数 1694
阅读 11
收藏 0

精选30+云产品,助力企业轻松上云!>>>

原文链接:https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx

EF 6 Code-First系列文章目录:

当两个实体之间不止一种关系的时候,可以使用InverseProperty特性,为了理解InverseProperty特性我们来做一个例子:
1.创建一个控制台应用程序,安装好EF:
enter description here
2.创建Course类:

 public class Course
    {
        public int CourseId { get; set; }

        public string CourseName { get; set; }

        public string Description { get; set; }

        public Teacher OnlineTeacher { get; set; }
    }

3.创建Teacher类:

public class Teacher
    {
       public int TeacherId { get; set; }

       public string Name { get; set; }

       public ICollection<Course> OnlineCourses { get; set; }
    }

上面的代码例子中,Course和Teacher实体之间是一对多的关系,一个Teacher可以教很多的Online Course。
3.创建上下文类:

public class EFDbContext:DbContext
    {
        public EFDbContext()
            : base("name=Constr")
        { }

        public DbSet<Course> Courses { get; set; }

        public DbSet<Teacher> Teachers { get; set; }
    }

4.SQL链接字符串:

<!--SQL链接字符串-->
  <connectionStrings>
    <add name="Constr" connectionString="Server=.;Database=EFAnnotationInversePropertyDB;uid=sa;pwd=Password_1" providerName="System.Data.SqlClient"/>
  </connectionStrings>

5.测试代码:

 class Program
    {
        static void Main(string[] args)
        {
            using (var db = new EFDbContext())
            {
                List<Course> lstModel = db.Courses.ToList();
            }
            Console.WriteLine("success");
            Console.ReadKey();
        }
    }

6.运行程序:
enter description here
可以看到,根据默认的约定,生成的数据库如下:
enter description here

现在假设Course和Teacher实体之间,还有一个一对多的关系:
Course类:

 public class Course
    {
        public int CourseId { get; set; }

        public string CourseName { get; set; }

        public string Description { get; set; }

        public Teacher OnlineTeacher { get; set; }

        public Teacher ClassRoomTeacher { get; set; }
    }

Teacher类:

 public class Teacher
    {
       public int TeacherId { get; set; }

       public string Name { get; set; }

       public ICollection<Course> OnlineCourses { get; set; }

       public ICollection<Course> ClassRoomCourses { get; set; }
    }

在上面代码例子中,Course和Teacher实体有两个一对多的关系。一门课程可以被一个Online Teacher教,也可以被一个class-room Teacher教。同样一个教师可以教多个Online Course,也可以教多个class-room Course.
删掉之前生成的数据库后,我们运行一下程序:
enter description here
看看生成的数据库:
enter description here
看到,EF为我们在Course表中,生成了4个外键。为了解决这个问题,我们使用InverseProperty特性。修改一下Teacher类的代码:
Teacher类:

public class Teacher
    {
       public int TeacherId { get; set; }

       public string Name { get; set; }

       [InverseProperty("OnlineTeacher")]
       public ICollection<Course> OnlineCourses { get; set; }

       [InverseProperty("ClassRoomTeacher")]
       public ICollection<Course> ClassRoomCourses { get; set; }
    }

Course类:

public class Course
    {
        public int CourseId { get; set; }

        public string CourseName { get; set; }

        public string Description { get; set; }

        public Teacher OnlineTeacher { get; set; }

        public Teacher ClassRoomTeacher { get; set; }
    }

在上面的例子中,InverseProperty特性应用在两个集合类型的导航属性OnlineCourses和ClassRoomCourses上,然后指定它们在Course实体中的相关联的导航属性,所以现在EF就能分辨出来相应的外键。EF 6将创建两个外键:OnlineTeacher_TeacherIdClassRoomTeacher_TeacherId。对于EF Core将会创建OnlineTeacherTeacherIdClassRoomTeacherTeacherId两个外键。
然后在删除数据库,重新运行一下程序:
enter description here

看一下生成的数据库:
enter description here

可以看到现在生成的数据库就是正确的了。
进一步配置,你可以使用ForeignKey特性来配置外键名称:
Course类:

public class Course
    {
        public int CourseId { get; set; }

        public string CourseName { get; set; }

        public string Description { get; set; }

        [ForeignKey("OnlineTeacher")]
        public int OnlineTeacherId { get; set; }
        public Teacher OnlineTeacher { get; set; }

        [ForeignKey("ClassRoomTeacher")]
        public int ClassRoomTeacherId { get; set; }
        public Teacher ClassRoomTeacher { get; set; }
    }

Teacher类:

public class Teacher
    {
       public int TeacherId { get; set; }

       public string Name { get; set; }

       [InverseProperty("OnlineTeacher")]
       public ICollection<Course> OnlineCourses { get; set; }

       [InverseProperty("ClassRoomTeacher")]
       public ICollection<Course> ClassRoomCourses { get; set; }
    }

上面代码中,我们在Corse类中添加两个属性列,配置外键,现在删除数据库,重新运行一下:
enter description here
看到报错了,我们修改一下Course类:
Course类最终代码:

 public class Course
    {
        public int CourseId { get; set; }

        public string CourseName { get; set; }

        public string Description { get; set; }

        [ForeignKey("OnlineTeacher")]
        public int? OnlineTeacherId { get; set; }
        public Teacher OnlineTeacher { get; set; }

        [ForeignKey("ClassRoomTeacher")]
        public int? ClassRoomTeacherId { get; set; }
        public Teacher ClassRoomTeacher { get; set; }
    }

重新运行程序:可以看到成功了。
enter description here

我们看看最终生成的数据库:
enter description here

可以看到生成的外键列就是我们自己自定义的名称了。
综上所述:当两个实体间有多个关系的时候,你可以使用InverseProperty 特性和ForeignKey 特性来配置实体。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)

原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-First系列文章目录: 1 翻译系列:什么是Code First(EF 6 Code First 系列) 2.翻......

osc_cldb1bbf
2019/04/02
2
0
9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】

原文链接:https://www.entityframeworktutorial.net/code-first/maxlength-minlength-dataannotations-attribute-in-code-first.aspx EF 6 Code-First系列文章目录: 1 翻译系列:什么是Cod......

osc_0q2mvgjv
2019/04/09
4
0
9.8 翻译系列:数据注解特性之--Required 【EF 6 Code-First系列】

原文链接:https://www.entityframeworktutorial.net/code-first/required-attribute-dataannotations-in-code-first.aspx EF 6 Code-First系列文章目录: 1 翻译系列:什么是Code First(EF 6......

osc_0q2mvgjv
2019/04/09
9
0
9.10 翻译系列:EF数据注解特性之StringLength【EF 6 Code-First系列】

原文链接:https://www.entityframeworktutorial.net/code-first/stringlength-dataannotations-attribute-in-code-first.aspx EF 6 Code-First系列文章目录: 1 翻译系列:什么是Code First(......

osc_0q2mvgjv
2019/04/09
2
0
9.6 翻译系列:数据注解之Index特性【EF 6 Code-First系列】

原文链接:https://www.entityframeworktutorial.net/entityframework6/index-attribute-in-code-first.aspx EF 6 Code-First系列文章目录: 1 翻译系列:什么是Code First(EF 6 Code First ......

osc_c438keit
2019/04/09
2
0

没有更多内容

加载失败,请刷新页面

加载更多

Saga分布式事务框架

1优点 1、避免服务之间的循环依赖,因为saga协调器会调用saga参与者,但参与者不会调用协调器 2、集中分布式事务编排 3、降低参与者的复杂性 4、回滚更容易管理 Saga模式的一大优势是它支持长...

战略板儿砖
20分钟前
11
0
为什么要使用static_cast (x)而不是(int)x? - Why use static_cast(x) instead of (int)x?

问题: I've heard that the static_cast function should be preferred to C-style or simple function-style casting. 我听说static_cast函数应该比C样式或简单的函数样式转换更可取。 Is......

fyin1314
22分钟前
16
0
最难的几道Java面试题,看看你跪在第几个?

这是我收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但...

码农突围
23分钟前
9
0
浅谈Spring核心技术 IOC与AOP

IOC: IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个M...

创业789
24分钟前
13
0
智能金融丨神州信息助某省联社实现一体化智能运维建设

近日,由神州信息实施的某省联社“IT服务管理平台项目”顺利通过验收,并获得客户的高度认可。该项目是神州信息在农信领域打造的又一标杆项目,为客户实现了IT运维流程标准化及运维系统一体化...

脉脉小达人
26分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部