前言

简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join  left join  或者子查询),也就是在设计表的时候预先设计好的,通过主外键进行关联。那么现在在Entity Framework中是如何配置处理的呢?

Entity Framework 关系约束配置

 对于实体关系对应的数据表关系,无非“0:1,1:1,1:N,N:N”这几种,可以使用导航属性中的数据类型来表示,0…1端使用单实体类型表示,N端使用ICollection集合类型表示。对于单实体端,默认是可为空的,即为0关系,如果要设置为1关系,要使用[Required]标签来进行标记。但对于一对一中的关系主体与依赖对象确无法做更细节的控制。

下面来依依看一下这几种数据表的关系

第一种:0:1。举例说明:有一个数据表Emplyee代表该公司的员工表,而该公司里的员工有一个通讯账号数据库表MessagingAccount,而有些员工不使用,也就是没有通讯账号。这就说明员工Employee和MessagingAccount之间的关系就是一个员工对应一个通讯账号,或者一个员工没有通讯账号。

WithOptional:将关系配置为required:optional。(required:0…1端的1,表示必需,不可为null;optional:0…1端的0,表示可选,可为null。下同)

modelBuilder.Entity<MessagingAccount>().HasRequired(m => m.Employee).WithOptional(n=>n.Acount);

配置一对〇关系,允许存在一个Employee而不存在MessagingAcount的情况(注意在Employee中添加Accout属性)

第二种:1:1.举例说明:还是第一种的例子中每个员工都有一个通讯账号的话。

WithRequiredDependent:将关系配置为required:required。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。

modelBuilder.Entity<Employee>().HasRequired(emp => emp.Acount).WithRequiredPrincipal(a => a.Employee);

第三种:1:N。举例说明:订单和谁下的订单。通常的关系都是一个订单只会由一个人来下,反过来也就是说一个人可能有多个订单。也就是一个Customer可以有多个Order.是一个一对多的关系。

modelBuilder.Entity<Order>().HasRequired(o=>o.Customer).WithMany();

第四种:N:N。举例说明:订单和产品之间的关系。一个Order订单可能会有多个产品Product的可能。同理,一个产品Product也会存在与多个订单Order当中。

            modelBuilder.Entity<Order>().HasMany(o => o.Products).WithMany(p => p.Orders).Map(m =>{m.ToTable("OrderDetails");m.MapLeftKey("OrderID");m.MapRightKey("ProductID");});

配置多对多的关系,并指定了表名、对应的外键;注意如果不使用FluentAPI配置,Product和Order配置了相应的导航属性,EF也会默认生成一张表(表名为“<数据类1>+<数据类2>”)

Map:将关系配置为使用未在对象模型中公开的外键属性。可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。

特殊的一种:组合主键的使用。

  //组合主键 modelBuilder.Entity<Order>().HasRequired(o => o.Customer).WithMany().HasForeignKey(o => new { o.CustomerNo,o.CustomerName});

复杂类型的使用。

modelBuilder.ComplexType<Name>().Property(m => m.FirstName).HasMaxLength(40);

转载于:https://www.cnblogs.com/aehyok/p/3338563.html

Entity Framework 关系约束配置相关推荐

  1. Entity Framework Codefirst的配置步骤

    Entity Framework Codefirst的配置步骤:  (1) 安装命令: install-package entityframework  (2) 创建实体类,注意virtual关键字在 ...

  2. java EF6,EF Core 2.0和EF6(Entity Framework 6)中配置实体映射关系

    1.EF6中通过EntityTypeConfiguration配置实体映射关系代码 public class AccountMap : EntityTypeConfiguration { public ...

  3. Entity Framework 5.0基础系列

    1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http:/ ...

  4. Entity Framework 5.0系列之约定配置

    Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的, ...

  5. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  6. 【配置映射】—Entity Framework实例详解

    前两篇博文中的配置属性和配置关系都是配置映射,配置属性是属性的映射,配置关系式关系的映射,本篇从讲讲实体的映射. 首先,配置实体映射到表,使用ToTable方法,它接受两个参数,第一个参数是表的名称, ...

  7. Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many

    通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?"血"的教训啊,刚开始使用 Entity ...

  8. LINQ TO SQL和Entity Framework 的关系 你了解多少?

    1. LINQ  TO SQL 和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist  C ...

  9. linq、lambda、entity framework之间的关系

    lambda: 一种匿名委托的精简版写法,明显的标志是=>符号 entity framework(简称EF): 微软访问数据库的最快捷最成熟的框架(ORM),在EF出现以前有SqlHelper. ...

最新文章

  1. 怎么将计算机网络设置家庭,“windows无法在此计算机上设置家庭组”问题如何解决...
  2. 自适应图像降噪滤波器的设计与实现
  3. lua学习笔试之迭代器和通用for
  4. 社保,交得越多亏得越多(转)
  5. linux进程被中断打断,linux – 当中断处理程序被另一个中断中断时,中断上下文如何“恢复”?...
  6. 读spring源码(一)-ClassPathXmlApplicationContext-初始化
  7. HAProxy高并发问题解决
  8. WCF学习笔记之序列化
  9. git管理复杂项目代码
  10. P8U8 IT这块出书门槛相对比较低
  11. c++基础语句(条件判断)
  12. 机器学习模型部署文章存档
  13. oracle数据库索引介绍,SQL Server和Oracle数据库索引介绍
  14. Akka与设备组一起工作《twelve》译
  15. 用户画像及其应用案例分享
  16. 全电发票的最新进展:有关咨询整理(上篇)
  17. html5 pacs浏览,基于HTML5的PACS--HTML5图像处理
  18. 猜数字?我要王者荣耀
  19. 二十三种设计模式(第十二种)-----代理模式(Proxy)
  20. 小程序工具类无云开发按钮(已解决)

热门文章

  1. css居中最佳方案,CSS 水平、垂直居中的5种最佳方案
  2. mysql 局域网存储_MySQL 存储过程
  3. @service注解_SpringBoot最最最常用的注解梳理
  4. python常用包有哪些品牌_python 常用包总结
  5. android 访问web.py,Appium 测试 Android 时,python 用例调用 Webdriver.remote 后无回应
  6. c语言教程 萌萌哒,本人C语言小白,帮我解释每段代码的意思。谢了萌萌哒
  7. JAVA中inputstring_java IO流 之 字节输入流 InputString()
  8. mysql 数据约束条件_mysql基本数据类型和约束条件
  9. tensorflow数据读取机制
  10. 浙江大学 PTA习题3.6 一元多项式的乘法与加法运算 (20分)