db.savechange()之后数据库更新了,但是代码查询的数据还是原来的数据 AsNoTracking()

导致的原因:
在查询之前,你已经对当前表进行过 db.[表名] 进行查询 了,这个表里的数据会加载到DBContext缓存中,而当你在当前方法或Controller中再次对该表或视图进行 db.[表名].FirstOrDefault() 的时候,实际读取的是第一次缓存中的数据,非数据库。

解决方法:
使用.AsNoTracking()方法

通俗解析:使用这个方法进行查询的时候,不会去读取DBcontext中的缓存,而是会从数据库里直接查询,

查看微软官方 AsNoTracking() 说明

截图:

在这里插入图片描述
谷歌翻译:
在这里插入图片描述

举例:
db.表名.AsNoTracking().FirstOrDefault()

总结:

看情况使用该方法;不要滥用;

AsNoTracking() 只能用于查询,不能把查询后的实体用作其他的用途,不然会导致其他的错误。
例如:我想查询数据库有没有一条数据,用AsNotracking()查询后,如果有就把他赋值给一个实体,如果没有就new一个新实体 。这样的话,因为AsNotracking()没有把这个实体加到EF跟踪里面,EF就会认为这个实体在数据库不存在,就会把查询后的实体添加到数据库,但是实际情况是这个实体是存在于数据库里面的,这样就会报数据重复的错误(如果存在unique等约束)。
所以使用AsNotracking()只能用于查询,不能用于其他赋值的操作

优点:通过缓存的形式去去读取,会加快程序的响应;
缺点:当再次去数据库中进行查询的时候,响应就会变得慢了;

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值