对象-关系映射框架比如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)的更多相关文章

  1. Contoso 大学 - 5 – 读取关联数据

    原文 Contoso 大学 - 5 – 读取关联数据 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's ...

  2. EF学习笔记(七):读取关联数据

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy l ...

  3. 【EF6学习笔记】(七)读取关联数据

    本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy loading 这种加载方式在于需要用到这个导航属性数据的时候,才会去数据库 ...

  4. EF学习笔记(八):更新关联数据

    学习笔记主目录链接:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考 ...

  5. 【EF6学习笔记】(八)更新关联数据

    上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考虑对于有关联的数据进行新增.删除.更新操作:比如Course .Instructor: ...

  6. EF里单个实体的增查改删以及主从表关联数据的各种增删 改查

    本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...

  7. ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK

    看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...

  8. ASP.NET MVC + EF 利用存储过程读取大数据

    ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...

  9. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

随机推荐

  1. 使用excel进行数据挖掘(5)---- 应用场景分析

    使用excel进行数据挖掘(5)---- 应用场景分析 在配置环境后,能够使用excel进行数据挖掘. 环境配置问题可參阅: http://blog.csdn.net/xinxing__8185/ar ...

  2. python(31)- 模块练习

    1. 小程序:根据用户输入选择可以完成以下功能:     创意文件,如果路径不存在,创建文件夹后再创建文件     能够查看当前路径     在当前目录及其所有子目录下查找文件名包含指定字符串的文件 ...

  3. Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块

    一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后.也有一些人在网 ...

  4. libpcre.so.0 被删除怎么办?

    删除  #rpm -e --nodeps pcre-6.6-1.1 1> wget   http://mirror.centos.org/centos/6/os/i386/Packages/pc ...

  5. 我的vim插件列表

    一.正在使用的插件 1. NERD tree   文件浏览 2. bufexplorer  buffer 浏览 3. mru.vim   最近使用的文件浏览 4. ctrlp.vim  文件模糊搜索, ...

  6. Linux中的du和df命令

    现在也将前阵子学习到du/df两个命令总结一下吧.前阵子测试工作中有遇到过由于磁盘空间满导致程序无法执行到情况,所以使用了df和du两个命令. du查看目录大小,df查看磁盘使用情况.我常使用的命令( ...

  7. JavaScript读书笔记(1)

    从今天开启每天看书记笔记模式,<JavaScript高级程序设计(第3版)> 1. Javascript最初是为了解决输入验证器的问题,现在已经发展成一门复杂的语言: 2.  语言标准为E ...

  8. A20 Android 编译

    cd lichee ./build.sh -p sun7i_android -b wing-sc3075gs cd ../android4.2 . build/envsetup.sh lunch wi ...

  9. Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.

    运行/usr/local/webserver/php/bin/phpize时出现: Configuring for: PHP Api Version: 20041225 Zend Module Api ...

  10. 手机QQ后台清理不掉的秘密——anddroid悬浮窗

    问题来自于一篇文章:手机QQ后台为何清不掉?MIUIproject师:全靠1像素的页面保命 出于好奇,想知道这一像素究竟是啥东西,用手机安全管家控制QQ的悬浮窗权限: 关闭QQ的悬浮窗权限,通过后台一 ...