读取关联数据(EF Core2.1.1)
对象-关系映射框架比如EF有三种 方式使用 模型中的导航属性来加载关联数据。
一、.Lazy Loading.(关联数据在访问导航属性时被透明的加载,不需要特别的代码,自动的加载)
当一个实体第一次读取的时候,关联数据不会被检索。然后,当你第一次访问这个实体的导航属性的时候,导航属性需要的数据自动的被检索。每当你第一次从导航属性获取数据时,都会向数据库发送查询。这样,会导致多个查询被发送到数据库。一个是实体本身,另外,每当实体的关联数据第一次被访问的时候。EF6.x的DbContext类默认启用了Lazy loading.
lazy loading 不支持AsNoTracking()方法,使用了.AsNoTracking(),lazy loading会发生异常。
而EF Core1的版本是不支持Lzay Loading的。从EF2.1.开始支持Lazy Loading,但必须是可以覆写的导航属性,也就是 说定义为虚 virtual属性,和能够被继承的。需要进行以下设置。
1、安装代理类
PMC:Install-Package Microsoft.EntityFrameworkCore.Proxies -Version 2.1.1
在Startup.cs配置文件中,ConfigureService方法中,
//启动文件,在依赖注入容器中注册数据库上下文对象。
2、services.AddDbContext<SchoolContext>(options =>
options.UseLazyLoadingProxies().UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); //如果未在Context中添加UseLazyLoadingProxies,导航属性不会添加。
departments =context.Departments;
foreach(Department d in departments)
{
foreach(Course c in d.Courses)
{
courseLIst.Add(d.Name + c.title)
}
}
二、EagerLoading (关联数据在初始的查询里面就从数据库加载)
当实体第一次被读取的时候,关联的数据一起被检索。这将会导致仅有的连接查询会检索所有需要的全部数据。通过EF core使用Include方法和ThenInclude方法来指定eagerLoding.
departments =context.Departments.Include(x =>x.Course) //一条语句就从数据库中加载所有的关联属性。
foreach(Department d in departments)
{
foreach(Course c in d.Courses)
{
courseList.Add(d.Name +c.Title);
}
}
三、Explicit loading (关联数据后来才能被显式的从数据库加载)
1.这个与lazy loading相似,除了需要显式的使用代码来检索关联数据。当你访问一个导航属性的时候,不会自动发生。需要通过对象状态管理器(object state manager)Entry手动的加载关联数据,,调用Collection.Load(导航属性为集合)方法和reference.Load(导航属性为单个实体)方法。你使用显式加载仅仅是关闭了lazy loading。
departments =context.Departments.Tolist();
foreach(Department d in departments)
{
context.Entry(d).Collection(d =>d.Courses).Load(); //用Entry load()代码明确从数据库加载关联数据。
foreach(Course c in d.Courses)
{
courseList.Add(d.Name +c.Title);
}
}
2.你能够使用单独的查询来检索数据,EF会 修复导航属性。也就是说EF自动地将它们所属的单独检索的实体添加到先前检索实体集的导航属性中。对于检索相关数据的查询,可使用Load方法而不是返回列表或对象的方法,例如:ToList()或者 Single()
departments =context.Departments.Include(x =>x.Courses)
foreach(Department d in departments)
{
context.Courses.Where(c =>c.DepartmentID == d.DepartmentId).Load(); //从数据库中加载实体的导航属性,使用load();
foreach(Course c in d.Courses) // 由于EF Core修复了导航属性,因此,这里不是lazy loading,而是eager loading.
{
courseList.Add(d.Name +c.Title)
}
}
因为lazy loading和explicit loading不会立即查询属性值,因为它们都属于延迟加载(deferred loading).
性能考虑
如果每一个实体的导航属性都需要被查询,eager loading通常能提供最好的性能,因为只有一个查询被发送到数据库,比起检索单个实体的独立的查询,减少了对数据库访问来回的次数,显得更加高效。
另一方面,在一些情况下,Lazy loading更加高效。Eager loading可能导致非常复杂的连接查询,SQL服务器不能有效的处理。如果你仅仅需要访问一个实体集的其中一部分(子集)实体的导航属性,则延迟加载可能会执行得更好,因为预先加载将检索比您需要的更多数据。 如果性能至关重要,最好以两种方式测试性能,以便做出最佳选择。
延迟加载可以掩盖导致性能问题的代码。例如,处理大量的实体,并且在每次迭代中使用了多个导航属性,没有指定eager loading或explicit loading ,这样的代码执行效率非常低。因为多次往返数据库。一个应用程序在本地开发过程中运行良好,但当移植到Azure SQL数据库时,由于延迟增加和Lazying loading可能出现性能问题。
序列化 的时候使用lazy loading将导致失控的链式反应,序列化之前要关闭lazy loading.
读取关联数据(EF Core2.1.1)的更多相关文章
- Contoso 大学 - 5 – 读取关联数据
原文 Contoso 大学 - 5 – 读取关联数据 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's ...
- EF学习笔记(七):读取关联数据
总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy l ...
- 【EF6学习笔记】(七)读取关联数据
本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy loading 这种加载方式在于需要用到这个导航属性数据的时候,才会去数据库 ...
- EF学习笔记(八):更新关联数据
学习笔记主目录链接:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考 ...
- 【EF6学习笔记】(八)更新关联数据
上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考虑对于有关联的数据进行新增.删除.更新操作:比如Course .Instructor: ...
- EF里单个实体的增查改删以及主从表关联数据的各种增删 改查
本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...
- ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK
看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...
- ASP.NET MVC + EF 利用存储过程读取大数据
ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
随机推荐
- python正则方法
通过正则替换字符串 res=re.sub(正则,newString,srcString)//返回替换后的字符串 res,m=res.subn(正则,newString,srcString)//返回替换 ...
- Django-content—type
Django包含一个contenttype应用,它可以追踪安装在你的Django项目里的所有的应用,并提供一个高层次的,通用的接口用于与你的模型进行交互 Contenttypes 的核心应用是Cont ...
- sublime 快捷键 汇总--长期
Ctrl+P 输入当前项目中的文件名,快速搜索文件 Ctrl+G 输入数字跳转到该行代码 Ctrl+R 输入关键字,查找文件中的函数名 Ctrl+: 输入关键字,查找文件中的变量名.属性名等 Ctrl ...
- 服务器启动时Webapp的web.xml中配置的加载顺序(转载)
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- Javascript MVC 学习笔记(二) 控制器和状态
今天进入第二个部分:控制器. 控制器和状态 从以往的开发经验来看.我们都是将状态保存在server的session或者本地cookie中,但Javascript应用往往被限制在单页面,所以我们也能够将 ...
- 从S3中导入数据到Dynamodb
本节如果你已经从Dynamodb中导出过数据,而且导出的文件以及被存入S3.文件内部结构会在Verify Data Export File 中描写叙述. 我们称之前导出数据的原始表为source ta ...
- 九度OJ 1089:数字反转 (数字反转)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3059 解决:1678 题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个 ...
- Package md5 implements the MD5 hash algorithm as defined in RFC 1321 base64
https://golang.google.cn/pkg/crypto/md5/ Go by Example 中文:Base64编码 https://books.studygolang.com/gob ...
- Machine Learning in Action(2) 决策树算法
决策树也是有监督机器学习方法. 电影<无耻混蛋>里有一幕游戏,在德军小酒馆里有几个人在玩20问题游戏,游戏规则是一个设迷者在纸牌中抽出一个目标(可以是人,也可以是物),而猜谜者可以提问题, ...
- requirejs测试
参考资料:http://www.ruanyifeng.com/blog/2012/11/require_js.html 一.文件目录 二.html <!DOCTYPE html> < ...