首页 新闻 会员 周边

ef查询问题 困扰小弟好几天 求大虾指点指点

0
悬赏园豆:50 [已解决问题] 解决于 2015-12-14 08:47

运行环境 是MVC系统  用ef操作数据库  界面是easyui  jquery.

在一个datagrid中选择一条记录 编辑  弹出一个编辑界面 后台从数据库中加载了选择的记录数据   然后修改了部分数据  保存成功了  数据库数据也更新了  关闭编辑界面  。重新选择 这条记录编辑  ,结果后台加载出来的仍然是修改前的 数据  而不是修改后的新数据。跟踪代码 发现  到ef查询语句 触发的sql查询语句 没问题  在数据库中查询 都是查询出的新数据  偏偏 这个ef查询反回的 却是修改前的数据.这是怎么回事呢?  缓存问题吗?小弟用ef时间不长  恳请大虾指点指点

Stone821的主页 Stone821 | 初学一级 | 园豆:132
提问于:2015-12-11 22:19
< >
分享
最佳答案
1

EF的DbContext也是有缓存的

收获园豆:30
打酱油的米饭 | 初学一级 |园豆:36 | 2015-12-14 07:33

是因为DBcontext 缓存问题。

代码做了以下调整:

原代码:

     public List<T> GetListBy(Expression<Func<T, bool>> whereLambda)         {

            List<T> list = null;           

  Logger("根据条件查询" + typeof(T).Name + "中的数据", () =>  

           {                 list = db.Set<T>().Where(whereLambda).ToList();             });             return list;   

      }

 

修改后的代码:

 

     public List<T> GetListBy(Expression<Func<T, bool>> whereLambda)         {

            List<T> list = null;         

    Logger("根据条件查询" + typeof(T).Name + "中的数据", () =>        

     {                 list = db.Set<T>().AsNoTracking().Where(whereLambda).ToList();             });          

   return list;      

   }

这样就没有问题了,返回的是数据库中最新的数据。

感谢大家的帮助

Stone821 | 园豆:132 (初学一级) | 2015-12-14 08:43

@Stone821: 刚好这也是我遇到过的问题,没想到有人跟我出现一样的问题,哈哈~

打酱油的米饭 | 园豆:36 (初学一级) | 2015-12-14 08:46
其他回答(3)
0

只要数据库是确定更新的,那就是缓存问题,看看是前端缓存(F12调试一下)还是后台缓存(断点跟踪一下)

收获园豆:5
Yu | 园豆:12980 (专家六级) | 2015-12-12 08:49
0

这是Datacontext的问题,你new 一个DBContext再加载就没问题了。

收获园豆:10
爱编程的大叔 | 园豆:30839 (高人七级) | 2015-12-12 09:16

正解,每次使用Datacontext要释放,下次重新实例化。最佳实践好像是处理每次请求时实例化一个Datacontext

支持(0) 反对(0) 于为源 | 园豆:956 (小虾三级) | 2015-12-12 11:03

@于为源: IUnitWork CallContext 来管理 实例上下文线程唯一 貌似比较好吧

支持(0) 反对(0) DJLNET | 园豆:232 (菜鸟二级) | 2015-12-14 09:58

@DJLNET: 不大了解IUnitWork CallContext,能否给科普一下,才疏学浅啊。只是知道如果用像autofac这种ioc框架的话能够制定生命周期,也大概是实例上下文线程唯一。在适当时候释放DataContext,还是要避免DataContext始终跟踪数据变化占用大量资源的吧。

支持(0) 反对(0) 于为源 | 园豆:956 (小虾三级) | 2015-12-14 10:09

@于为源: CallContext 是保证一个请求线程 只用一个DBcontext 以节约系统开销,如果一个请求有很多查询,都开一个DBcontext 对资源占用比较大。 CallContext 就是在new DBcontext 之前先判断一下线程中是否有DBcontext实例了,如果有 则用现成的实例。如果没有  再生成一个新实例。代码如下:

  DbContext dbContext = CallContext.GetData(typeof(DBContextFactory).Name) as DbContext;
           if (dbContext == null)
           {
                 dbContext = new ZodiacEntities();
               CallContext.SetData(typeof(DBContextFactory).Name, dbContext);
           }
               return dbContext;

支持(0) 反对(0) Stone821 | 园豆:132 (初学一级) | 2015-12-14 13:47

@Stone821: 谢谢

支持(0) 反对(0) 于为源 | 园豆:956 (小虾三级) | 2015-12-15 17:53
0

应该是因为 你获取数据是通过ajax请求获取.这个时候你加一个 随机参数移除前端的缓存 即可;

收获园豆:5
万雅虎 | 园豆:326 (菜鸟二级) | 2015-12-12 11:25

这个已经试过了 不行。问题已经解决了 ,是因为DBcontext 缓存问题。谢谢!

支持(0) 反对(0) Stone821 | 园豆:132 (初学一级) | 2015-12-14 08:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册