首页 新闻 会员 周边 捐助

EntityFramework Attach更新后页面取不到最新数据

0
悬赏园豆:10 [已解决问题] 解决于 2013-09-12 09:59

使用EF Attach(entity)后SaveChanges(),此时数据库里已经是最新的,但是页面上仍旧是修改前的数据,怎样才能获取到最新的数据呢?

晖洒自如的主页 晖洒自如 | 初学一级 | 园豆:34
提问于:2013-09-11 13:17
< >
分享
最佳答案
0

页面上的数据是如何取得的?

收获园豆:10
dudu | 高人七级 |园豆:29568 | 2013-09-11 14:01

通过Repository类取出来的,是不是由于延迟加载的原因?

晖洒自如 | 园豆:34 (初学一级) | 2013-09-11 14:10

@晖洒自如: SaveChanges之后重新通过Repository取了吗?

dudu | 园豆:29568 (高人七级) | 2013-09-11 14:15

@dudu: 我是在A模块中新增a实例时,同时修改了b实例的一个相关属性,然后我进入B模块的页面时,controller的Index方法会通过Repository取数据,这时取出的数据是之前的旧数据,停止调试重新Debug调试的时候,取出的数据才是正确的了

晖洒自如 | 园豆:34 (初学一级) | 2013-09-11 14:25

@晖洒自如: DbContext是同一个实例吗?

dudu | 园豆:29568 (高人七级) | 2013-09-11 14:28

@dudu: 是的,所有的ModelRepository都是继承同一个DbContext

晖洒自如 | 园豆:34 (初学一级) | 2013-09-11 14:36

@晖洒自如: 

问题与这个有关,EF直接从自己的缓存中拿数据,而缓存中是旧数据。

为什么用Attach而不用Add?

dudu | 园豆:29568 (高人七级) | 2013-09-11 14:46

@dudu: 新增a时我是用aRepository.Add(a),同时用bRepository.attach(b)的,因为b是已存在的实例,所以我用attach的,你这里说的Add是指?

晖洒自如 | 园豆:34 (初学一级) | 2013-09-11 15:05

@晖洒自如: Attach之后,修改一下EntityState试试

dudu | 园豆:29568 (高人七级) | 2013-09-11 15:13

@dudu: 在BaseRepository类里面的Attach方法中有更改状态的

public virtual void Attach(T entity)

{

  this.context.Set(this.CurrentType).Attach(entity);

  this.context.Entry(entity).State=EntityState.Modified;

}

查了些资料可能是EF的读取模式是从缓存读的.....不知道在哪里设置

晖洒自如 | 园豆:34 (初学一级) | 2013-09-11 17:02

@晖洒自如: Attach之后缓存应该会被更新的

dudu | 园豆:29568 (高人七级) | 2013-09-11 17:05

@dudu: 原因找到了,看了一篇帖子上面提到“用单例直接处理EF的上下文也不是很合适。最好的方式应该是 在一次处理请求中(web开发)使用同一个ObjectContext实例即可”,我仔细的看了下自己的代码,business层那边我用了static,去除后就可以了,EF里确实要少用单例模式啊

晖洒自如 | 园豆:34 (初学一级) | 2013-09-12 09:49

@晖洒自如: 汗!不是要少用,要是根本不能用单例。

dudu | 园豆:29568 (高人七级) | 2013-09-12 09:59

@dudu: 是的,无知是最大的敌人,以后多多努力,不犯这种低级错误了,谢谢你的回帖!

晖洒自如 | 园豆:34 (初学一级) | 2013-09-12 10:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册