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

接上一篇

经过进一步测试发现

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

手动Deteach之后

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

导航属性会为null

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

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

在逻辑层,需要放入cache。

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

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

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

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

原文地址:https://www.cnblogs.com/czcz1024/p/2397911.html