最近在学习用EF,感觉EF有些设计很难理解,有点反人类.
我用的是vs2013开发, EF6框架
想用EF做一个中间的缓存,但是缓存的数据需要是最新的.可是数据被查询出来一次后,就永远是这个数据,任凭数据库中的值怎么变化,本地的EF数据都不变,
网上查了一些资料说,可以用NoTracking.确实这儿可以查询到数据库的最新值,但是那样就完全没有缓存的功能了,而且本地的local里面的值,还是过时的旧数据.
我希望在我需要的时候可以更新笨笨local的数据.
又查了很多资料,发现一个MergeOption 选项,原本以为这个可以靠谱一点,再查了N多api文档后发现.EF6用的是DbContext.是没有这个选项可以配置的,只有ObjeceContext才可以.
我晕了,
难道,DBcontext就只可以用,过时的缓存数据吗,都无法更新一下.
------解决思路----------------------
是的,主要是EF要实现乐观并发。缓存是有其特殊意义的,否则会导致并发风险的发生。举个很直观的例子。
User表有UserCode,UserName,Age字段。执行系列步骤:
1)客户端1,从数据库第一次取出时,是:张三。
2)然后客户端2,将张三改为李四,提交到数据库。此时数据库中为李四
3)客户端1修改了Age = 30
4)假设客户端1,从数据库重取的时候,能够取出李四,那么它将被保存在Original Buffer中,但客户端当前缓存(Current Buffer)里是张三,因此客户端1的EF提交时,会发现UserName数据不一致,EF产生的sql语句会是,update User Set UserName = ‘张三’,Age = 30。
而如果EF数据库重取不会取出李四,那么如果客户端1不改UserName,客户端1的Original Buffer和Current Buffer中的UserName都是张三,因此EF提交时生成的SQL语句会是,update User Set Age = 30。
由此,我们会发现,从数据库中重取数据后,导致了客户端1的老数据(UserName)覆盖了客户端2的新数据
------解决思路----------------------
我还不是很清楚是想实现什么样的需求。一般处理请求的时候创建DbContext,结束时销毁,这个过程并不长,新的context取的就是数据库最新数据,为什么还要在这个过程中再同步,这看起来不合理。如果真想这么做,可以用 ((IObjectContextAdapter)context).ObjectContext 获得内部的ObjectContext,上面有Refresh方法可以刷新一组数据,应该类似 http://stackoverflow.com/questions/18169970/how-do-i-refresh-dbcontext 这里面的回答。