EF中的查询执行时机:
1. foreach进行枚举
2. ToArray、ToList、ToDictionary
3. Linq的一些操作,如First、Any
4. DbSet上的Load操作。DbEntityEntry.Reload和Database.ExecuteSqlCommand

在web application中,每一个请求使用一个context实例;在WPF中,每个form使用一个context实例
context不是线程安全的

加载实体的方式:

1.贪婪加载(eager loading)

2.延迟加载(lazy loading)

3.显示加载(explicit loading)

贪婪加载实现是通过include方法实现的

 1 using (var context = new BloggingContext())
 2 {
 3     // Load all blogs and related posts
 4     var blogs1 = context.Blogs
 5                           .Include(b => b.Posts)
 6                           .ToList();
 7
 8     // Load one blogs and its related posts
 9     var blog1 = context.Blogs
10                         .Where(b => b.Name == "ADO.NET Blog")
11                         .Include(b => b.Posts)
12                         .FirstOrDefault();
13
14     // Load all blogs and related posts
15     // using a string to specify the relationship
16     var blogs2 = context.Blogs
17                           .Include("Posts")
18                           .ToList();
19
20     // Load one blog and its related posts
21     // using a string to specify the relationship
22     var blog2 = context.Blogs
23                         .Where(b => b.Name == "ADO.NET Blog")
24                         .Include("Posts")
25                         .FirstOrDefault();
26 }

View Code

延迟加载通过virtual关键字进行实现(当EF框架禁用了延迟加载,这种方式就无效了)

 1 public class Blog
 2 {
 3     public int BlogId { get; set; }
 4     public string Name { get; set; }
 5     public string Url { get; set; }
 6     public string Tags { get; set; }
 7
 8     public virtual ICollection<Post> Posts { get; set; }
 9 }
10
11 //禁用延迟加载
12 public class BloggingContext : DbContext
13 {
14     public BloggingContext()
15     {
16         this.Configuration.LazyLoadingEnabled = false;
17     }
18 }

View Code

当禁用了延迟加载后或不使用延迟加载时,通过显示加载仍然可以获取管理的数据

 1 using (var context = new BloggingContext())
 2 {
 3     var post = context.Posts.Find(2);
 4
 5     // Load the blog related to a given post
 6     context.Entry(post).Reference(p => p.Blog).Load();
 7
 8     // Load the blog related to a given post using a string
 9     context.Entry(post).Reference("Blog").Load();
10
11     var blog = context.Blogs.Find(1);
12
13 //一对多时使用Collection
14     // Load the posts related to a given blog
15     context.Entry(blog).Collection(p => p.Posts).Load();
16
17     // Load the posts related to a given blog
18     // using a string to specify the relationship
19     context.Entry(blog).Collection("Posts").Load();
20 }
21
22 //使用Query方式进行一些过滤
23 using (var context = new BloggingContext())
24 {
25     var blog = context.Blogs.Find(1);
26
27     // Load the posts with the 'entity-framework' tag related to a given blog
28     context.Entry(blog)
29         .Collection(b => b.Posts)
30         .Query()
31         .Where(p => p.Tags.Contains("entity-framework")
32         .Load();
33
34     // Load the posts with the 'entity-framework' tag related to a given blog
35     // using a string to specify the relationship
36     context.Entry(blog)
37         .Collection("Posts")
38         .Query()
39         .Where(p => p.Tags.Contains("entity-framework")
40         .Load();
41 }

View Code

转载于:https://www.cnblogs.com/goodlucklzq/p/4665899.html

EF中加载实体的方式相关推荐

  1. Android中加载事件的方式

    Android中加载事件的方式 通过内部类的方式实现 通过外部类的方式实现 通过属性的方式实现 通过自身实现接口的方式实现 通过内部类的方式实现 Demo btn_Login.setOnClickLi ...

  2. Spring中加载xml配置文件的六种方式

    Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog  因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...

  3. Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)

    1. JDBC Spark SQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中. 1.1. 从MySQ ...

  4. spark mysql 写_Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)...

    1. JDBC Spark SQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中. 1.1. 从MySQ ...

  5. Java中加载配置文件方式的总结

    当需要在Java中加载配置文件的时候,有几个选项提供选择: ·        File ·        Class.getResourceAsStream ·        Class.getCla ...

  6. 浅谈android中加载高清大图及图片压缩方式(二)

    这一讲就是本系列的第二篇,一起来聊下关于android中加载高清大图的问题,我们都知道如果我们直接加载原图的话,一个是非常慢,需要等待一定时间,如果没有在一定的时间内给用户响应的话,将会极大影响用户的 ...

  7. 高德地图 Vue 中 加载 数据可视化 Loca 的方式

    高德地图 Vue 中 加载 数据可视化 Loca 的方式 今天想用 Loca 试试如何的,结果怎么都加载不上,我的代码是这样的 AMapLoader.load({key: "这个就不展示了& ...

  8. android加载声音文件,Android是在应用程序中加载和播放声音的最快方式

    我正在开展一个项目,我必须在一个活动中加载6种不同的声音,并在按钮点击时播放所有声音.声音文件不是那么大,但问题是它们可能会更多.所以我的问题是这是在单个活动中加载声音文件的最快方法.出于测试目的,我 ...

  9. linux内核采取,采用动态加载模块的方式Linux内核编译

    Linux内核是一种单体内核,但是通过动态加载模块的方式,使它的开发非常灵活方便.那么,它是如何编译内核的呢?我们可以通过分析它的Makefile入手.以下是一个简单的hello内核模块的Makefi ...

最新文章

  1. 精选180+Python开源项目,随你选!做项目何愁没代码
  2. 一句话总结人工神经网络
  3. awk 分隔符 多个空格_如何在awk中指定多个分隔符
  4. 【转】体验 Silverlight 5 3D开发之环境搭配篇
  5. java jsch 密钥登陆_我们可以使用JSch进行基于SSH密钥的通信吗?
  6. linux下xargs命令用法详解
  7. [Leetcode][第201题][JAVA][数字范围按位与][位运算][Brian Kernighan]
  8. 采用Docker集成jquery-file-upload组件到WEB应用
  9. 为了解决架构的问题,我们需要先理解敏捷的真谛
  10. Docker-----Cgroup资源配置详细教程,图文并茂
  11. 谷歌浏览器不能用_正在用 Chrome 或 Edge 浏览器的你,不能错过这亿个好用插件...
  12. mysql免安装版教程视频_MySQL免安装版安装教程
  13. PostgreSQL视图和物化视图
  14. bat脚本_更改文件夹访问权限
  15. HTTP协议理解及服务端与客户端的设计实现
  16. 移动应用的必杀技:超级app+轻应用
  17. 4和2大于号小于号箭头那边_小于号怎么打键盘(大于小于号怎么区分)
  18. python笔记更新(网络编程)
  19. VGPNet:基于灭点的道路和路面标志的检测与识别
  20. 数学建模比赛经验总结

热门文章

  1. keras cnn注意力机制_从发展历史视角解析Transformer:从全连接CNN到Transformer
  2. Java的Arrays.sort()良心总结
  3. mysql错误1451_mysql错误代号-J(1451~1494)
  4. 【linux技术】分布式存储技术实战演练
  5. 盘点2020年10个最难忘的数据泄露事件
  6. 【实验】不会部署VRRP?看完就会了
  7. linux抓源地址,【Linux】apt-get 源地址汇总
  8. Dubbo 在 K8s 下的思考
  9. modbus协议和串口服务器,Modbus RTU通信模式与Modbus ASCII通信模式的异同点
  10. 多少分才能考上重庆计算机学校,重庆多少分能上985大学?重庆985院校分数线是多少?(2021年参考)...