EF 关于内存共享dbcontext 时发生的问题

mylogic 2016-10-10 04:02:10
我用的mysql数据库,为什么手动修改数据库内容后,数据库已经更新,但程序中查询到的数据没有变化?只有重启程序再查询才会变过来?没有用到事务。
我用下面的方式共享dbcontext
 DbContext dbContext = CallContext.GetData("myDbContext") as DbContext;
if (dbContext == null)
{
dbContext = new hisEntities();

//dbContext.Configuration.ValidateOnSaveEnabled = false;

CallContext.SetData("myDbContext", dbContext);
}
return dbContext;
...全文
617 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mylogic 2016-10-26
  • 打赏
  • 举报
回复
谢谢诸位的建议,由于业务逻辑跨表较多,其他一些场景还会用到事务,为了方便传递实体对象,目前使用了共享的DbContext,以保证不会因为数据库上下文变动导致操作失败
mylogic 2016-10-26
  • 打赏
  • 举报
回复
引用 1 楼 D56233577 的回复:
默认情况下,EF会将之前查询出的数据存为本地数据,如果下一次查询返回了相同主键的数据,那么EF不会更新本地数据而是直接返回本地数据,从而造成和数据库不一致。 你可以使用AsNoTracking()或者每次都new一个新的DbContext来解决以上问题。
视图的查询,我用AsNoTracking()解决了新数据刷新问题,测试结果看貌似直接查表不会有这样的问题,只有视图是这样,目前还是用的共享dbContext的方式
游离失所 2016-10-11
  • 打赏
  • 举报
回复
这里共享dbcontext的方式没问题 dbcontext本来就是线程不安全的。而CallContext是为线程提供独立的数据插槽。这样下来就可以保证dbcontext'线程单例'。。 问题不是出在这块代码里
D56233577 2016-10-11
  • 打赏
  • 举报
回复
奉劝楼上说没关系的各位,别什么都想当然,拿实践来检验你说的话。
xiaoqiu_net 2016-10-11
  • 打赏
  • 举报
回复
你数据差不到最新的 和你 共享不共享DbContext没什么关系呀。? 这样线程中DbContext唯一也是没有问题的。 排除找其他的问题。
圣殿骑士18 2016-10-10
  • 打赏
  • 举报
回复
你这个问题,就是共享dbContext造成的
圣殿骑士18 2016-10-10
  • 打赏
  • 举报
回复
共享dbContext的方式是不对的,dbContext就应该用完就释放,应该作为方法内的局部变量! 我发现很多人都喜欢把dbContext全局化,是写cs程序写的比较多吧?
D56233577 2016-10-10
  • 打赏
  • 举报
回复
当然,将已有的数据分离掉或者ReLoad也是可以的,但都是繁琐的方式。建议你不要共享DbContext。
D56233577 2016-10-10
  • 打赏
  • 举报
回复
默认情况下,EF会将之前查询出的数据存为本地数据,如果下一次查询返回了相同主键的数据,那么EF不会更新本地数据而是直接返回本地数据,从而造成和数据库不一致。 你可以使用AsNoTracking()或者每次都new一个新的DbContext来解决以上问题。

17,748

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧