NoTracking官方解释

跟踪与非跟踪查询

跟踪行为可控制 Entity Framework Core 是否将有关实体实例的信息保留在其更改跟踪器中。 如果已跟踪某个实体,则该实体中检测到的任何更改都会在 SaveChanges() 期间永久保存到数据库。Entity Framework Core 还会修正从跟踪查询中获取的实体与先前已加载到 DbContext 实例中的实体两者之间的导航属性。

可以理解为:

DbContext如果配置为TrackAll。

则DbContext会跟踪返回的实体实例,记录增删改查的跟踪记录,并自动整合变化,推送Diff Change保留至数据库。

DbContext如果配置为NoTracking。

则DBContext不会跟踪实体变化(不再自动标记实体变化,但手动标记仍有效),并不自动修正变化。

1.对增删改查的影响

NoTracking  不允许 相同的实体被标记多次

也就是 Attach 的实体必须有不同的标记。

但TrackAll不会有此问题,因为会自动修正2个实体标记

2.查询缓存

public void Test()
{
var id = st.T_User.Select(o => o.ID).FirstOrDefault(); using (FLFPermissionEntities ent = dbr.CreateContext<FLFPermissionEntities>())
{
using (FLFPermissionEntities sub1 = new FLFPermissionEntities())
{
var jm = sub1.FlexUpdate<T_User>(o => o.Name = "lcc", o => o.ID == id);
if (jm.HasMsg())
Assert.Fail(jm.msg);
} var user21 = ent.T_User.FirstOrDefault(o => o.ID == id); Console.WriteLine($"TrackAllDBContext 第一次读取:{user21.Name}"); using (FLFPermissionEntities sub2 = new FLFPermissionEntities())
{
Console.WriteLine($"改变Name的值为lcc2");
var jm = sub2.FlexUpdate<T_User>(o => o.Name = "lcc2", o => o.ID == id);
if (jm.HasMsg())
Assert.Fail(jm.msg);
} var user22 = ent.T_User.FirstOrDefault(o => o.ID == id);
Console.WriteLine($"TrackAllDBContext 第二次读取:{user22.Name}");
} using (FLFPermissionEntities ent = dbr.CreateReadContext<FLFPermissionEntities>())
{
using (FLFPermissionEntities sub1 = new FLFPermissionEntities())
{
var jm = sub1.FlexUpdate<T_User>(o => o.Name = "lcc", o => o.ID == id);
if (jm.HasMsg())
Assert.Fail(jm.msg);
} var user21 = ent.T_User.FirstOrDefault(o => o.ID == id); Console.WriteLine($"NoTrackDBContext 第一次读取:{user21.Name}"); using (FLFPermissionEntities sub2 = new FLFPermissionEntities())
{
Console.WriteLine($"改变Name的值为lcc2");
var jm = sub2.FlexUpdate<T_User>(o => o.Name = "lcc2", o => o.ID == id);
if (jm.HasMsg())
Assert.Fail(jm.msg);
} var user22 = ent.T_User.FirstOrDefault(o => o.ID == id);
Console.WriteLine($"NoTrackDBContext 第二次读取:{user22.Name}"); }
}

NoTrack的结果是正确的,TrackAll的结果与实际结果不同

会发现 TrackAll的 2次查询 结果是一样的,而且TrackAll的第二次读取时已经访问了数据,但出来的结果 还是lcc  并不是lcc2。

所以TrackAll 会从数据库读取数据后,根据跟踪记录里的数据信息,覆盖数据库中读取的结果

DbContext 认为 跟踪记录的数据必须统一且数据已跟踪记录为准

EF的 NoTracking 的一些记录的更多相关文章

  1. EF操作与Linq写法记录

    项目总结:EF操作与Linq写法记录 1.EF引入 新建一个MVC项目之后,要引用EF框架,可以按照以下步骤进行: 1),在Models中添加项目 2),选择Entity Data Model,并重新 ...

  2. EF连接字符串小问题记录

    1.EFDbContext”不包含必需的 providerName 特性: <connectionStrings> <add name="EFDbContext" ...

  3. EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态

    本文目录 查看实体当前.原始和数据库值:DbEntityEntry 查看实体的某个属性值:GetValue<TValue>方法 拷贝DbPropertyValues到实体:ToObject ...

  4. EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录

    前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...

  5. EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题

    下订单减库存的方式 现在,连农村的大姐都会用手机上淘宝购物了,相信电商对大家已经非常熟悉了,如果熟悉电商开发的同学,就知道在买家下单购买商品的时候,是需要扣减库存的,当然有2种扣减库存的方式, 一种是 ...

  6. EntityFramework日志记录

    首先在应用启动时执行:DbInterception.Add(new LogFormatter());   然后加入如下类: #region [ EF的数据库执行日志记录 ] public class ...

  7. MVC3学习:利用mvc3+ajax实现删除记录

    首先根据模板生成list视图,上面就会有一个delete的链接,但是模板自带的这种删除,需要另外再打开一个删除页,再进行删除.我们可以利用ajax来改写,实现在当前页删除. 在视图上面,将原来的 @H ...

  8. Entity Framework学习记录

    记录一次ef code first的学习记录 最近想做一套自己的框架,正在寻找合适的ORM,之前参照力软(很早之前的版本了)的底层代码,做了一套自己的增删改查, 但是使用起来总觉得缺了点什么? 所以决 ...

  9. Entity Framework 6.X实现记录执行的SQL功能

    Entity Framework在使用时,很多时间操纵的是Model,并没有写sql语句,有时候为了调试或优化等,又需要追踪Entity framework自动生成的sql(最好还能记录起来,方便出错 ...

随机推荐

  1. python基础语法9 生成器,面向对象编程思想,三元表达式,列表生成式,生成器表达式(生成式),匿名函数,内置函数

    生成器 1.什么是生成器? 生成的工具. 生成器是一个 "自定义" 的迭代器, 本质上是一个迭代器. 2.如何实现生成器 但凡在函数内部定义了的yield, 调用函数时,函数体代码 ...

  2. 阿里云部署,ubuntu, 连接服务器 |更新源| 安装node |安装mysql

    1.连接服务器 xshell 新建连接 ssh root@1.1.1.1 2.更新源 apt-get update 3.安装node apt-get install -y curl curl -sL ...

  3. iOS系统的两个循环

    1.事件循环: 2.显示循环:displaylink:系统定时从gpu缓存获取图片信息显示在屏幕.

  4. 什么叫pure function(纯函数)

    (来自:http://en.wikipedia.org/wiki/Pure_function) 在计算机编程中,假如满足下面这两个句子的约束,一个函数可能被描述为一个纯函数: 给出同样的参数值,该函数 ...

  5. Linux中的磁盘练习

    查看磁盘接口类型 ide dh[a-z] scsi sd[a-z] 添加磁盘 先添加一个磁盘 cd /dev/ ls sd* 可以看到先添加的磁盘 磁盘分区 .fdisk /dev/sdb n (添加 ...

  6. 项目构建工具ant的使用

    ant是项目构建工具,以xml文件作为构建文件,在这个xml文件(默认是build.xml,当然也可以取其它名字)里我们可以定义多个目标,用我们期待的方式去构建项目,比如说编译,测试,发邮件等等. a ...

  7. 洛谷P2068 统计和题解

    题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区 ...

  8. dedecms复制网上的带有图片的文章,图片不能自动下载到本地的解决方法

    dede有时看到比较好的文章需要复制,粘贴到自己的dede后台发布,dede是有图片自动本地化的功能,就是复制过来后自动下载到你的服务器上了,这样省去了你单独去另存图片再上传的过程,尤其是遇到有很多图 ...

  9. web: 屏蔽button元素的空格键和enter响应

    用tab键可以在各种元素之间切换焦点,然后键盘上的空格和enter按键触发click事件,我这里不想要这种效果. 所以我需要屏蔽这两个按键. function keyup(e) { var currK ...

  10. 论文阅读 | Recurrent Attentional Reinforcement Learning for Multi-label Image Recognition

    源地址 arXiv:1712.07465: Recurrent Attentional Reinforcement Learning for Multi-label Image Recognition ...