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

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

在EF 6和EF Core中,数据注解中的ForeignKey特性,是用来在两个实体间配置外键关系。根据默认的约定,当属性的名称与相关实体的主键属性匹配时,EF将该属性作为外键属性。ForeignKey Signature: [ForeignKey(name string)]
name:相关联的导航属性的名称或者相关联的外键属性名称
看看下面实体间的一对多关系:

  1. using System.ComponentModel.DataAnnotations.Schema;
  2. public class Student
  3. {
  4. public int StudentID { get; set; }
  5. public string StudentName { get; set; }
  6. //Foreign key for Standard
  7. public int StandardId { get; set; }
  8. public Standard Standard { get; set; }
  9. }
  10. public class Standard
  11. {
  12. public int StandardId { get; set; }
  13. public string StandardName { get; set; }
  14. public ICollection<Student> Students { get; set; }
  15. }

上面的代码例子中,描述了Student和Standard实体中的一对多关系。为了解释一对多关系,Student类包含了一个StandardId属性还有一个引用类型的属性Standard,并且Standard实体包含了一个集合类型的导航属性Students,Student实体中的StandardId属性匹配上了Standard实体中的主键属性名称StandardId,所以Student实体中的StandardId属性将会自动变成外键属性,并在数据表中生成外键:

ForeignKey特性重写了默认的外键约定,他允许我们在依赖实体中【这里是Student】指定外键属性,这个指定的外键属性名称,不需要匹配主体实体【这里是Standard】中的主键属性名称。
使用ForeignKey数据注解特性,可以有以下三种方式:

  1. [ForeignKey(NavigationPropertyName)]应用在依赖实体的外键标量属性上面,ForeignKey里面的name参数,填写导航属性的名称
  2. [ForeignKey(ForeignKeyPropertyName)]应用在依赖实体的导航属性上面,ForeignKey里面的name参数,填写外键属性的名称
  3. [ForeignKey(ForeignKeyPropertyName)]应用在主体实体的导航属性上面,ForeignKey里面的name参数,填写外键属性的名称

1.[ForeignKey] on the foreign key property in the dependent entity

ForeignKey应用在依赖实体的外键属性上面,相关联的导航属性的名称作为ForeignKey的name参数传入:

  1. using System.ComponentModel.DataAnnotations.Schema;
  2. public class Student
  3. {
  4. public int StudentID { get; set; }
  5. public string StudentName { get; set; }
  6. [ForeignKey("Standard")]
  7. public int StandardRefId { get; set; }
  8. public Standard Standard { get; set; }
  9. }
  10. public class Standard
  11. {
  12. public int StandardId { get; set; }
  13. public string StandardName { get; set; }
  14. public ICollection<Student> Students { get; set; }
  15. }

在上面的例子中,ForeignKey特性应用于StandardRefId属性上,并且传入导航属性的名称Standard到name参数上,这样就会在Students表中创建一个外键列StandardRefId,这样就不会生成默认的StandardID列了。

2.[ForeignKey] on the navigation property in the dependent entity

ForeignKey特性可以应用在导航属性上面,然后name参数就指定外键属性列的名称:

  1. using System.ComponentModel.DataAnnotations.Schema;
  2. public class Student
  3. {
  4. public int StudentID { get; set; }
  5. public string StudentName { get; set; }
  6. public int StandardRefId { get; set; }
  7. [ForeignKey("StandardRefId")]
  8. public Standard Standard { get; set; }
  9. }
  10. public class Standard
  11. {
  12. public int StandardId { get; set; }
  13. public string StandardName { get; set; }
  14. public ICollection<Student> Students { get; set; }
  15. }

在上面的例子中,ForeignKey特性应用在Standard导航属性上面,name参数就是外键属性的名称StandardRefId,这样就会在Students数据表中,生成一个StandardRefId外键列,就不会生成默认的StandardId列了。

3.[ForeignKey] on the navigation property in the principal entity

ForeignKey特性可以应用在主体实体的导航属性上面,name参数就指定外键属性的名称:

  1. using System.ComponentModel.DataAnnotations.Schema;
  2. public class Student
  3. {
  4. public int StudentID { get; set; }
  5. public string StudentName { get; set; }
  6. public int StandardRefId { get; set; }
  7. public Standard Standard { get; set; }
  8. }
  9. public class Standard
  10. {
  11. public int StandardId { get; set; }
  12. public string StandardName { get; set; }
  13. [ForeignKey("StandardRefId")]
  14. public ICollection<Student> Students { get; set; }
  15. }

在上面的例子中,ForeignKey特性应用于主体实体Standard中的导航属性Students上,这样同样会在Students表中创建一个外键列StandardRefId.
好了,以上就是数据注解之ForeignKey特性,大家有什么不明白可以留言,感谢支持!

9.5 翻译系列:数据注解之ForeignKey特性【EF 6 Code-First系列】的更多相关文章

  1. 9.6 翻译系列:数据注解之Index特性【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/entityframework6/index-attribute-in-code-first.aspx EF ...

  2. 9.2 翻译系列:数据注解特性之---Column【EF 6 Code First系列】

    原文链接:http://www.entityframeworktutorial.net/code-first/column-dataannotations-attribute-in-code-firs ...

  3. 1 翻译系列:什么是Code First(EF 6 Code First 系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/what-is-code-first.aspx EF 6 Code-First系列文章目录 ...

  4. 7.2 数据注解属性--TimeStamp特性【Code-First 系列】

    TimeStamp特性可以应用到领域类中,只有一个字节数组的属性上面,这个特性,给列设定的是tiemStamp类型.在并发的检查中,Code-First会自动使用这个TimeStamp类型的字段. 下 ...

  5. 9.10 翻译系列:EF数据注解特性之StringLength【EF 6 Code-First系列】

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

  6. 9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/maxlength-minlength-dataannotations-attribut ...

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

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

  8. 9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】

    原文链接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.a ...

  9. 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...

随机推荐

  1. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

  2. 042 将数据导入hive,将数据从hive导出

    一:将数据导入hive(六种方式) 1.从本地导入 load data local inpath 'file_path' into table tbname; 用于一般的场景. 2.从hdfs上导入数 ...

  3. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相 ...

  4. Hdu-1358Period(KMP算法之next数组的应用)

    题解:对于串pattern来说,如果0~i-1这个位置中循环,那么i%(i-next[i])==0 ,循环次数为 i/(i-next[i]),循环长度为 i-next[i] 例如对于串ababab来说 ...

  5. PyQt5安装及ModuleNotFoundError: No module named 'PyQt5'问题解决

    PyQt5安装及ModuleNotFoundError: No module named 'PyQt5'问题解决     安装pyQt5费了很多的周折,不过现在还是安装好了,现在重新梳理一下整个安装过 ...

  6. Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)

    requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...

  7. 观察者模式之ES6实现(二)

    一.问题描述实现一个EventEmitter类,这个类包含以下方法:on(监听事件,该事件可以被触发多次)once(也是监听事件,但只能被触发一次)fire(触发指定的事件)off(移除指定事件的某个 ...

  8. 移动端html页面分享

    开发APP应用比开发移动端网页挑战小,因为APP应用只需要适配不同手机即可,而移动端网页不仅需要适配不同手机,还要适配同一部手机的不同浏览器. 移动端页面分享是一个常用的功能,需要宿主环境,可以是某A ...

  9. Web大前端面试题-Day11

    86.如何获得高效的数据库逻辑结构? 从关系数据库的表中 删除冗余信息的过程 称为数据规范化, 是得到高效的关系型数据库表的逻辑结构 最好和最容易的方法. 规范化数据时应执行以下操作: 1.将数据库的 ...

  10. python魔法方法-属性访问控制

    属性访问控制 所谓的属性访问控制就是控制点号访问属性的行为,而且不仅是类的外部,连类的内部也受控制,代码见真章,边看代码边解释: __getattr__(self, item) 定义当访问不存在的属性 ...