EF中加载实体的方式

加载实体的方式:

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 }

延迟加载通过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 }

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

 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 }

时间: 2024-10-19 02:21:37

EF中加载实体的方式的相关文章

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

因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装入系统,这就需要利用Spring去动态加载某一位置下的配置文件,所以就总结了下Spring中加载xml配置文件的方式,我总结的有6种, xml是最常见的spring 应用系统配置源.Spring中的几种容器都支持使用xml装配bean,包括: XmlBeanFactory,ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicati

Velocity中加载vm文件的三种方式

Velocity中加载vm文件的三种方式: a.  加载classpath目录下的vm文件 Properties p = new Properties(); // 加载classpath目录下的vm文件 // 这里是加载模板VM文件,比如:/META-INF/template/Web_B2CPayment.vm(请参考mas_spring_integration.xml) p.setProperty("file.resource.loader.class", "org.apa

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

这一讲就是本系列的第二篇,一起来聊下关于android中加载高清大图的问题,我们都知道如果我们直接加载原图的话,一个是非常慢,需要等待一定时间,如果没有在一定的时间内给用户响应的话,将会极大影响用户的体验.另一个是如果你的手机内存小的话,可能会直接崩溃.这也就是直接加载高清原图问题.遇到这些问题很容易想到的一点就是图片压缩,本篇文章也就是讲述图片压缩方式来实现加载高清大图的效果.但是现在问题就来了,通过上篇博客我们知道,手机的分辨率有很多,如何保证我同一张图片在不同分辨率的手机上能适当的压缩比例

转 Velocity中加载vm文件的三种方式

Velocity中加载vm文件的三种方式 velocitypropertiespath Velocity中加载vm文件的三种方式:   方式一:加载classpath目录下的vm文件 Properties p = new Properties(); p.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); Ve

MyBatis Java不同方式加载文件时的路径格式问题、Mybatis中加载.properties文件

public class LoadPropTest { public static void main(String[] args) throws IOException { //一.Properties的load方法加载文件输入流 Properties props=new Properties(); File file1=new File("F:/Program Files/Java/IdeaProjects/MyBatisDemo/src/db.properties"); File

[Android] Android ViewPager 中加载 Fragmenet的几种方式

Android ViewPager 中加载 Fragmenet的几种方式 1.当fragment里面的内容较少时,可以利用加载view 的方法来进行: private List<View> viewList; //在onCreate方法里面添加  viewList = new ArrayList<View>();        View view1 = View.inflate(this, R.layout.view1, null);        View view2 = Vie

[Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二.使用Fragment来填充ViewPager Google 官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page以及管理 每个Page的生命周期!当然它给我们提供了两个不同的Adapter,他们分别是: FragmentPageAdapter和Fragm

《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-11  测试实体引用或实体集合是否加载 问题 你想测试关联实体或实体集合是否已经加载到上下文中,另外你想使用Code-First来管理数据访问. 解决方案 假设你有如图5-26所示的概念模型 图5-26 一个包含projects,managers和contractors的模型 在Visual Studio中添加一个名为Recipe11的控制台应用,并确保引用了实体框架6的库,NuGet可

《Entity Framework 6 Recipes》中文翻译系列 (23) -----第五章 加载实体和导航属性之预先加载与Find()方法

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-2  预先加载关联实体 问题 你想在一次数据交互中加载一个实体和与它相关联实体. 解决方案 假设你有如图5-2所示的模型. 图5-2 包含Customer和与它相关联信息的实体 和5-1节一样,在模型中,有一个Customer实体,一个与它关联的CustomerType和多个与它关联的CustomerEamil.它与CustomerType的关系是一对多关系,这是一个实体引用(译注:Cu