前言

不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题。

EF 6.x和EF Core 何种情况下必须配置映射关系?

在EF 6.x中我们创建如下示例类。

    public partial class Customer{public int Id { get; set; }public string Name { get; set; }public string Email { get; set; }public ICollection<Order> Orders { get; set; } = new List<Order>();}

    public class Order : BaseEntity{public int Quantity { get; set; }public string Code { get; set; }public decimal Price { get; set; }public int CustomerId { get; set; }public Customer Customer { get; set; }}

上述我们不显式配置映射关系,EF和EF Core会根据约定来配置,同样达到如我们期望的,无论是EF 6.x还是EF Core中通过Inlcude进行显式加载有两种方式,一种是基于字符串,另外一种则是通过lamda表达式的方式(命名空间存在于System.Data.Entity),接下来我们来看下:

            using (var ctx = new EfDbContext()){ctx.Database.Log = Console.WriteLine;var customers = ctx.Customers.Include(d => d.Orders).ToList();};

这样是我们一直以来最正常的操作,如前言所叙,那么导航属性难道必须是public吗?接下来我们来试试。我们尝试将Orders导航属性配置成如下私有的。

 private ICollection<Order> Orders { get; set; } = new List<Order>();

因为其为私有,若通过lambda表达式肯定是访问受限制,那么我们改为通过基于字符串的方式来显式加载,如下:

            using (var ctx = new EfDbContext()){ctx.Database.Log = Console.WriteLine;var customers = ctx.Customers.Include("Orders").ToList();};

如上则抛出异常找不到Orders导航属性,是不是到此下结论而定导航属性必须是public呢?访问修饰符除了public,还有protected、internal以及protected internal。通过实践验证若导航属性为private、protected访问修饰符肯定不行,若为internal和protected internal则可以,前提是必须显式配置映射关系,否则也不行,如下:

 protected internal ICollection<Order> Orders { get; set; } = new List<Order>();

 HasMany(p => p.Orders).WithRequired(p => p.Customer).HasForeignKey(k => k.CustomerId);

那么在EF Core是否也和EF 6.x一样呢?我们继续来看看在EF Core中的情况,示例类为Blog和Post,这两个类已经在博客文章多次被用到,就不再给出,我们只关系导航属性访问修饰符的配置,如下:

private ICollection<Post> Posts { get; set; } = new List<Post>();

            using (var context = new EFCoreDbContext()){var blogs = context.Blogs.Include("Posts").ToList();}

此时会同样抛出异常,只不过异常信息大意是Posts不是Blog导航属性的一部分,对于基于字符串的Include方法,导航属性名称要以点分隔开,最终结果还是是找不到Posts导航属性,接下来我们将访问修饰符改为internal看看。

 internal ICollection<Post> Posts { get; set; } = new List<Post>();

            using (var context = new EFCoreDbContext()){var blogs = context.Blogs.Include(d => d.Posts).ToList();//var blogs1 = context.Blogs.Include("Posts").ToList();}

此时我们再来显式配置映射关系则好使。

            builder.HasMany(m => m.Posts).WithOne(o => o.Blog);

总结

对于EF和EF Core中通过Include方法进行显式加载具体实现没有去看源码,完全通过实践得到的结论是:无论是EntityFramework还是EntityFramework Core,在关系映射中导航属性不一定必须是public修饰符,也可以为internal和protected internal,但是前提是必须显式配置映射关系,否则将抛出无法找到导航属性异常。

转载于:https://www.cnblogs.com/CreateMyself/p/9180797.html

EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?相关推荐

  1. Java程序员从笨鸟到菜鸟之(五十七)细谈Hibernate(八)Hibernate集合Map关系映射

                 对于hibernate中,集合属性在Hibernate的映射文件中是非常常见的,也是非常重要的内容,理解和熟练掌握常用的集合属性则显得更为重要.在hibernate的配置文件 ...

  2. Hibernate 一对一关系映射总结篇

    在Hibernate 关系映射中一对一是比较常见也常用的一种,一对一的关系映射类型中又可分为:一对一外键单向映射.一对一外键双向映射.一对一主键单向映射和一对一主键双向映射. 下面就简单的说下自己对这 ...

  3. 关系模式的任何属性(关系模式的任何属性为什么不可再分)

    关系模式是什么呢? 关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映象关系 资产的属性与计量模式的关系是什么? 对资产的这一认识, ...

  4. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher {public int Id { get; set; }p ...

  5. EntityFramework 6.x和EntityFramework Core必须需要MultipleActiveResultSets?

    前言 本节我们来探讨到底需不需要在连接字符串上加上MultipleActiveResultSets = true ?,若您有更深层次的理解欢迎留下您的脚印. EntityFramework 6.x和E ...

  6. 神经网络是存储了海量的信息还是将海量的关系映射存储在了一起(发挥了存储记忆功能),还是变成了看似是一个公式,实际是成千上万个规律的公式融合在一个式子中( 类似于正弦波的傅里叶分解成无限中频率的波的加和

    神经网络是存储了海量的信息还是将海量的关系映射存储在了一起(发挥了存储记忆功能): 还是变成了看似是一个公式,实际是成千上万个规律的公式融合在一个式子中( 类似于正弦波的傅里叶分解成无限中频率的波的加 ...

  7. java继承 映射_hibernate继承关系映射和java反射机制的运用

    转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...

  8. 组成关系映射(注解)

    组成关系映射(注解) @Embeddable:表明该JavaBean是组件类. @Embedded:用于组件属性,以标明实体Bean的组件属性. @AttributeOverrides:该注释作用于组 ...

  9. mysql数据库对象关系映射

    http://www.2cto.com/database/201310/248690.html mysql数据库对象关系映射 1.对"对象关系映射"的理解 a.对象:可以理解为ja ...

最新文章

  1. UNIX网络编程 第3章 套接字编程简介
  2. 通过XML文件生成View
  3. JS函数浅析之constructor、prototype属性
  4. [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)
  5. 【博客话题】感谢您,我的老师
  6. 一个Json在线格式化的网站
  7. IllegalArgumentException:@Body parameters cannot be used with form or multi-part encoding
  8. 【python】列表的定义与操作
  9. 《The One!团队》第八次作业:ALPHA冲刺(三)
  10. AD画封装的血泪教训:有叉的放在外侧
  11. java 配置dbcp_java – 使用DBCP进行Tomcat配置
  12. PyTricks : Python is Cool
  13. Java 阶乘(BigInteger)
  14. matlab cnn 实例,Deep Learning学习 之 CNN代码解析(MATLAB)(示例代码)
  15. MATLAB之特征值和特征向量
  16. 如何定向网件路由防火墙与URL
  17. <马哲>价值规律的内容、表现形式及其作用
  18. 鼠标指针下总出现一个滚动条似的方框,怎么办?有图
  19. 树的前序,中序,后序遍历。
  20. Java后端对接微信支付(微信小程序、APP、PC端扫码)非常全,包含查单、退款

热门文章

  1. java程序设计经典课堂讲课_Java程序设计与开发经典课堂
  2. linux离线安装virtualen,在Virtualbox中安装PuppyLinux实录三
  3. 初识 Vue(01)---(输出 Hello World)
  4. Android Day05-网络编程之文件下载之多线程断点续传技术
  5. Memcache持久性分布式数据MemcacheDB
  6. python程序设计实验配置_20181235 实验三《Python程序设计》实验报告
  7. 对于python的感受_聊聊我对python的感受
  8. Unity渲染管线-百人计划笔记
  9. 论文写作思路_2018年的16个写作思路
  10. 程序员里面开源_如何以开源程序员的身份开始