EF的 NoTracking 的一些记录
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 的一些记录的更多相关文章
- EF操作与Linq写法记录
项目总结:EF操作与Linq写法记录 1.EF引入 新建一个MVC项目之后,要引用EF框架,可以按照以下步骤进行: 1),在Models中添加项目 2),选择Entity Data Model,并重新 ...
- EF连接字符串小问题记录
1.EFDbContext”不包含必需的 providerName 特性: <connectionStrings> <add name="EFDbContext" ...
- EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态
本文目录 查看实体当前.原始和数据库值:DbEntityEntry 查看实体的某个属性值:GetValue<TValue>方法 拷贝DbPropertyValues到实体:ToObject ...
- EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录
前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...
- EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题
下订单减库存的方式 现在,连农村的大姐都会用手机上淘宝购物了,相信电商对大家已经非常熟悉了,如果熟悉电商开发的同学,就知道在买家下单购买商品的时候,是需要扣减库存的,当然有2种扣减库存的方式, 一种是 ...
- EntityFramework日志记录
首先在应用启动时执行:DbInterception.Add(new LogFormatter()); 然后加入如下类: #region [ EF的数据库执行日志记录 ] public class ...
- MVC3学习:利用mvc3+ajax实现删除记录
首先根据模板生成list视图,上面就会有一个delete的链接,但是模板自带的这种删除,需要另外再打开一个删除页,再进行删除.我们可以利用ajax来改写,实现在当前页删除. 在视图上面,将原来的 @H ...
- Entity Framework学习记录
记录一次ef code first的学习记录 最近想做一套自己的框架,正在寻找合适的ORM,之前参照力软(很早之前的版本了)的底层代码,做了一套自己的增删改查, 但是使用起来总觉得缺了点什么? 所以决 ...
- Entity Framework 6.X实现记录执行的SQL功能
Entity Framework在使用时,很多时间操纵的是Model,并没有写sql语句,有时候为了调试或优化等,又需要追踪Entity framework自动生成的sql(最好还能记录起来,方便出错 ...
随机推荐
- wordpress防止垃圾邮件的另一种方法
我们知道wordpress可以用Akismet插件防止垃圾邮件,前面ytkah还讲过contact form 7如何搭配Akismet过滤垃圾邮件,还有什么方法呢?我们留在网站上的邮箱有可能被爬虫批量 ...
- Spring Boot 配置文件密码加密两种方案
Spring Boot 配置文件密码加密两种方案 jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring 项目中.可以快速集成到 Spring Boot 项 ...
- MANIFEST.MF文件对Import-Package/Export-Package重排列
众所周知,MANIFEST.MF文件中的空格开头的行是相当于拼接在上一行末尾的.很多又长又乱的Import-Package或者Export-Package,有时候想要搜索某个package却可能被换行 ...
- mybatis include refid="Base_Column_List"含义
<sql id="Base_Column_List" > collegeID, collegeName </sql> <select id=" ...
- c++、oc、swift初步评价
c++是面向对象的多态语言: oc是面向对象的动态语言: swift是面向对象.面向协议.高阶类型.函数式编程语言:
- .dxf文件
DXF 是 AutoCAD 与其它软件之间进行 CAD 数据交换的开放矢量数据文件格式,可以分为两类:ASCII 格式和二进制格式:ASCII 具有可读性好的特点,但占用的空间较大:二进制格式则占用的 ...
- 学习:窗口创建以及消息处理basic.c
WNDCLASS结构: Windows 的窗口总是基于窗口类来创建的,窗口类同时确定了处理窗口消息的窗口过程(回调函数). 在创建应用程序窗口之前,必须调用 RegisterClass 函数来注册窗口 ...
- MongoDB的安装、基本操作
此说明文档针对的community版本是v4.2.0(1)下载下载官网,此时的community版本是v4.2.0https://www.mongodb.com/download-center/com ...
- Thanos prometheus 集群以及多租户解决方案docker-compose 试用(一)
prometheus 是一个非常不多的metrics 监控解决方案,但是对于ha 以及多租户的处理并不是很好,当前有好多解决方案 cortex Thanos prometheus+ influxdb ...
- 原手下一名98年的java离职了
原手下一名98年的java离职了,回家考试要2年. 系统做的还算凑合,毕竟年龄在这. 需要改善的地方我会放到自己的项目管理工具中去改善. 离职前他一直跟我说微服务的启动是用docker,也感谢他,我们 ...