使用EF Attach(entity)后SaveChanges(),此时数据库里已经是最新的,但是页面上仍旧是修改前的数据,怎样才能获取到最新的数据呢?
页面上的数据是如何取得的?
通过Repository类取出来的,是不是由于延迟加载的原因?
@晖洒自如: SaveChanges之后重新通过Repository取了吗?
@dudu: 我是在A模块中新增a实例时,同时修改了b实例的一个相关属性,然后我进入B模块的页面时,controller的Index方法会通过Repository取数据,这时取出的数据是之前的旧数据,停止调试重新Debug调试的时候,取出的数据才是正确的了
@晖洒自如: DbContext是同一个实例吗?
@dudu: 是的,所有的ModelRepository都是继承同一个DbContext
@晖洒自如:
问题与这个有关,EF直接从自己的缓存中拿数据,而缓存中是旧数据。
为什么用Attach而不用Add?
@dudu: 新增a时我是用aRepository.Add(a),同时用bRepository.attach(b)的,因为b是已存在的实例,所以我用attach的,你这里说的Add是指?
@晖洒自如: Attach之后,修改一下EntityState试试
@dudu: 在BaseRepository类里面的Attach方法中有更改状态的
public virtual void Attach(T entity)
{
this.context.Set(this.CurrentType).Attach(entity);
this.context.Entry(entity).State=EntityState.Modified;
}
查了些资料可能是EF的读取模式是从缓存读的.....不知道在哪里设置
@晖洒自如: Attach之后缓存应该会被更新的
@dudu: 原因找到了,看了一篇帖子上面提到“用单例直接处理EF的上下文也不是很合适。最好的方式应该是 在一次处理请求中(web开发)使用同一个ObjectContext实例即可”,我仔细的看了下自己的代码,business层那边我用了static,去除后就可以了,EF里确实要少用单例模式啊
@晖洒自如: 汗!不是要少用,要是根本不能用单例。
@dudu: 是的,无知是最大的敌人,以后多多努力,不犯这种低级错误了,谢谢你的回帖!