MergeOption.NoTracking 与db.Detach(item)的区别

本文探讨了Entity Framework中使用NoTracking选项时遇到的问题,即导航属性不会变为null,这可能导致缓存问题。文章提供了几种解决方法,包括如何正确地分离对象状态以便将它们放入缓存。

接上一篇

经过进一步测试发现

db.Orders.MergeOption = System.Data.Objects.MergeOption.NoTracking;
orderlist = db.Orders.ToList();
查出来的东西,虽然状态也是Deteached,但是导航属性不是null
 

手动Deteach之后

db.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Detached);
或
db.Detach(item);
注意,第二种方法如果已经是Deteached状态会报错
 

导航属性会为null

但是如果查询的时候已经加了NoTracking,是不行的

 

比如,在数据层,通过NoTracking方式取得了一些数据

在逻辑层,需要放入cache。

则需要建立一个新的ObejctContext先attach,再deteach,才能保证他的导航属性为null。

 

导航属性为null,才能顺利的放入cache。

为了在notracking下,导航属性为null,必须明确指定lazyload=false

这算不算是ef的bug呢,同样都是deteached,但是状态却还有不同。

转载于:https://www.cnblogs.com/czcz1024/archive/2012/03/15/2397911.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值