MergeOption.NoTracking 与db.Detach(item)的区别
接上一篇
经过进一步测试发现
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,但是状态却还有不同。