davin

Just a little thinking and interest!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  53 随笔 :: 8 文章 :: 127 评论 :: 13万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

   在我前一篇blog Lazy Loading(一)(延迟加载)。一些前辈说不喜欢EF的种种。所以须说明一点,我写关于Entity  Framework的文章不是为了大家都接受EF。正如system.data.objects dev guy(a developer in EF)的blog文why use Entity Framwok中对Nhibernate和Entity Framework比较所说的那样,“我不是要让大家放弃Nhibernate或其它的ORM框架或者说要让大家相信EF比Nhibernate或其它的框架要好,它们不同的地方就意味着你可以根据你的实际情况做出不同的决定来选择合适的工具”。无所谓那种框架,适合即是最好的。

  下面进入正题,为了更好地说明EF在加载实体时的不同特征,故引用Linq To Sql作为参照。

 

上面的模型比起上一篇文章中的模型多了2个实体,Order,Product。关系也简单叙述一下employeeTest:Order=>1:n,Order:Product=>n:n 多对多的关系映射到Order_Product由于不带负载就不必作为一个实体呈现出来,不明白看我EDM中多对多关系(Many-to-Many Acssociation)以及有效负载(Payloads)问题 这篇。

复制代码
Code
复制代码

 跟踪上面代码,你就知道Sql查询执行在FirstOrDefault()方法执行时,这点和Linq to sql是相同的。接下来我们通过employee来访问关联对象Order。

Code

  在没有执行 employee.Order.Load() 之前,employee.Order.Count是为0的,因为EF默认是不会隐式加载关联实体的,必须显式去加载(及时记载,Eager Loading)。即是不会在查询得到employee的同时,自动取出的关联对象Order的集合.在Linq to sql里面是隐式加载关联实体。 刚刚是通过Employee访问Order,下面反过来试试;

Code

 2个实体相互访问的不同在于employeeTest 与Order是1:n的关系。除了上面的显式加载方式,在EF中实现Eager Laoding就是使用Include:

Code
  如3个查询语句:第一个的生成的Sql语句很复杂,那是因为我模型里继承用的比较多,导致生成sql判断比较多
Code

与第2条生成的sql查询

Code

     比较很容易发现,使用了Include("Order") sql就相应添加了LEFT OUTER JOIN Order 表。不过我没弄明白第3个查询没有立即执行 IQueryable<employeeTest> 明明已经已经指明了加载类型employeeTest.我的疑惑是因为我发现除了以上2种Eager Loading 的方式还有另外一种方式:

 var query = from Order o in context.Order where o.OrderID == guid select o;在这个Linq查询中 我指明了类型,query就不再是延迟加载了,而是Egaer Loaidng.

    最后再看看关于Include加载多极关联对象的示例代码:

 

复制代码
Code
复制代码

 

 

posted on   davin  阅读(3735)  评论(3编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示