专栏首页技术博客Entity Framework 关系约束配置

Entity Framework 关系约束配置

前言

简单的说一下自己的理解,大家应该都很明白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);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C# 泛型的简单理解(安全、集合、方法、约束、继承)

    泛型允许你在编译时实现类型安全。它们允许你创建一个数据结构而不限于一特定的数据类型。然而,当使用该数据结构时,编译器保证它使用的类型与类型安全是相一致的。泛型提...

    aehyok
  • 设计模式之前奏(UML类图)

    本人菜菜一个,最近一直在博客园游走闲逛,看到了各种技术,各种各种……。便看到了大话设计模式这本书,下了电子版的看了看第一章,感觉相当不错,不仅通俗易懂,而且与实...

    aehyok
  • Entity Framework CodeFirst数据迁移

    我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod...

    aehyok
  • 织梦生成栏目报错解决方案

    这是因为模板里调用了GetTopTypename()这个函数,而你程序中没有这个函数引起的报错,我们添加这个函数进去就可以了。

    华创信息技术
  • 图解Java设计模式之UML类图

    1)UML – Unified modeling language UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思...

    海仔
  • CSS和html使用规则?

    十月梦想
  • Qt Creator OPenGL实例

    sofu456
  • Spring入门(一)——IOC

    Inversion of Control,减低计算机代码间的耦合度,对象的创建交给外部容器完成,不用再new了

    晚上没宵夜
  • 工具资源系列之给mac装个虚拟机 原

    mac 系统安装虚拟机目前有两种主流软件,一种是 Parallels Desktop ,另一种是 vmware.

    雪之梦技术驿站
  • 【iPhone10周年】王威廉谈NLP:智能助理几家仍需努力

    【新智元导读】什么是自然语言处理?在 iPhone十周年之际,王威廉应 UC Santa Barbara Current 之邀请,谈了谈人工智能,并简要介绍了自...

    新智元

扫码关注云+社区

领取腾讯云代金券