MSDN上对MergeOption枚举的定义为:

成员名称
说明

AppendOnly
不会从数据源加载对象上下文中已存在的对象。这是查询或调用 EntityCollection<(Of <(TEntity>)>)Load 方法时的默认行为。

OverwriteChanges
对象始终从数据源进行加载。数据源值会重写在对象上下文中对对象所做的任何属性更改。

PreserveChanges
当一个对象存在于对象上下文中时,不会从数据源加载该对象。保存在对象上下文中对对象所做的任何属性更改。

NoTracking
对象保持为 Detached 状态,也不在 ObjectStateManager 中进行跟踪。

描述的很含糊,所以我做了个简单的测试。

1、随便查询一个实体对象出来,使ObjectContext中存在该实体对象的缓存。

2、修改该实体对象属性,使其成为Modified状态

2、使用断点在查询后暂停程序

3、去数据库修改这条数据

4、分别以GetObjectByKey、Where()以不同的MergeOption方式对重新查询该条数据。情况分别如下:

AppendOnly

该状态下,无论是GetObjectByKey还是Where()都取到的是ObjectContext上的副本(携带Modified状态),没有真正访问数据库(后测试发现确实产生了数据查询,但是获取出来的值依然是上下文副本中的,并且这次查询并不会改变上下文中的CurrentValue和OriginalValue,即便上下文中实体为Modified状态。暂时不知道为什么会是这样的设计结果)。

OverwriteChanges
该状态下,GetObjectByKey获取到的依然是ObjectContext上的副本(携带Modified状态),但使用Where语句后,三个语句查出来的对象都被更改为数据库当前实际数据,状态。即,使用OverwriteChanges枚举调用Where语句,取出数据会覆盖当前ObjectContext上的数据以及关联的这些副本。
NoTracking
该状态相对比较简单,Where语句直接从数据库获取数据,并且状态为Detached,也不影响ObjectContext中的对象。

PreserveChanges
该状态可能是最难理解的。第一次测试时,发现类似于AppendOnly枚举,执行完后,三个语句查出来的对象都是在ObjectContext中Modified状态的原对象,可能没有访问数据库,我就奇怪那他和AppendOnly有什么区别呢?于是我把修改对象属性的那行代码注释掉后,也就是在ObjectContext中的对象状态为Unchanged,再去执行GetObjectByKey和Where()语句,这时候就发生变化了:Where语句直接取到了数据库中最新的数据,并把ObjectContext以及相关联的对象副本都进行了更新。
因此,PreserveChanges的意思是,如果对象属性被修改过,则保留修改记录,否则从数据库直接获取数据

 

解决办法:重写MergeOption为NoTracking

方法一:永久设置实体集MergeOption为NoTracking

?

1

ctx.BasicInfoEntities.MergeOption = MergeOption.NoTracking;

方法二:只设置该次调用为NoTracking

?

1

string flowCode=ctx.BasicInfoEntities.Execute(MergeOption.NoTracking).Where(x=>x.UIID==tempGuid).FirstOrDefault().FlowCode;

entity framework 去缓存的更多相关文章

  1. Entity Framework教程(第二版)

    源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...

  2. 重新认识了下Entity Framework

    什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...

  3. ADO.NET Entity Framework 在哪些场景下使用?

    在知乎回答了下,顺手转回来. Enity Framework已经是.NET下最主要的ORM了.而ORM从一个Mapping的概念开始,到现在已经得到了一定的升华,特别是EF等对ORM框架面向对象能力的 ...

  4. Entity Framework 与 面向对象

    说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述 ...

  5. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  6. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  7. 3、ASP.NET MVC入门到精通——Entity Framework增删改查

    这里我接上讲Entity Framework入门.从网上下载Northwind数据库,新建一个控制台程序,然后重新添加一个ado.net实体数据模型. EF中操作数据库的"网关"( ...

  8. Code First :使用Entity. Framework编程(7) ----转发 收藏

    第7章 高级概念 The Code First modeling functionality that you have seen so far should be enough to get you ...

  9. ADO.NET、NHibernate和Entity Framework的比较

    ---原文地址:http://www.xuebuyuan.com/2162973.html 1,ADO.NET属于传统的数据访问工具,开发的时候需要我们手动去编写操作数据库的各种操作,当然性能也就不用 ...

随机推荐

  1. C++11空指针: nullptr

    参考[C++11]新特性--引入nullptr NULL 在C++中, 经常会用到空指针, 一般用NULL表示空指针, 但是NULL却是这样定义的 #ifndef NULL #ifdef __cplu ...

  2. 【笔试题】Spring笔试题

    spring笔试题 1.Spring支持的事务管理类型 Spring支持两种类型的事务管理: 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护. 声明式事务管理:这意味 ...

  3. Docker与Android Studio的冲突问题

    在行业内,VisualBox.VMware.Hyper-V冲突也不是什么秘密了 我在公司的电脑上先安装了Docker,并在安装Docker之前在BIOS中开启了虚拟化支持,所以在启动Docker时没有 ...

  4. 总结分析Java常见的四种引用

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 本章前文介绍的引用实际上都是强引用, ...

  5. Sqli-labs less 12

    Less-12 本关和less11是类似的,只是在id 的参数的处理上有一定的不同 当输入username:admin" Password: (随便) 报错后的结果为: You have a ...

  6. A - Chinese Girls' Amusement ZOJ - 2313(大数)

    You must have heard that the Chinese culture is quite different from that of Europe or Russia. So so ...

  7. 设计模式之State模式

    State模式定义: 允许一个对象在状态改变是,改变它的行为.看起来对象似乎修改了它的类. 模式理解(个人): State模式主要解决的事在开发中时常遇到的根据不同状态需要进行不同的处理操作的问题,而 ...

  8. UML对象图、包图

    对象图(Object Diagram)显示了一组对象和他们之间的关系.使用对象图阿狸说明数据结构,类图中的类或组件等实例的快照.对象图和类图一样,反应了系统的静态过程,但它是以实际的或原型化为基础来表 ...

  9. Binary Tree Longest Consecutive Sequence -- LeetCode

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  10. NOIP2018训练题集

    1. CZday3C 给定有m个数的集合,从其中任选一个子集满足全部&后不为零,问方案数. 考虑对二进制位容斥,问题转化为求包含某个二进制位集合的数的个数,通过类似FMT的DP求解. #inc ...