有没有办法禁用LINQ的对象跟踪功能,而不禁用延迟加载的子关联?
我在一组集成测试中使用LINQ2SQL。我只使用LINQ来验证数据库中的更改,因此我希望它像一个简单的数据访问层而不是完整的ORM。为此,我设置数据上下文的ObjectTrackingEnabled属性为false以防止LINQ缓存数据。这样可以正常工作,除了它破坏了实体之间的关联。
例如,假设两个表为WIDGET和CATEGORY,它们之间具有FK关系。启用对象跟踪后, widgetInstance.CATEGORY 正确延迟加载。禁用对象跟踪后,不会延迟加载任何内容,并且CATEGORY属性始终为null。
如何在不阻止延迟加载的情况下阻止LINQ缓存数据?
更新:这是答案引用的a link to the MSDN page。进一步的研究发现我可以使用LoadWith来加载子数据。在我的情况下,我只想要数据,所以急切加载就好了。
答案 0 :(得分:15)
根据MSDN:
延迟加载需要对象 跟踪。只有以下三个 模式有效:
ObjectTrackingEnabled = false。 DeferredLoadingEnabled被忽略 推断是假的。这种行为 对应于只读 DataContext的。
ObjectTrackingEnabled = true。 DeferredLoadingEnabled = false。这个 情境对应于DataContext 允许用户加载对象 使用LoadWith指令绘制图形, 但它不会启用延期 负荷。
两者都设置为true。这是 默认值。
你要么必须启用对象跟踪和分离实体(这是可行的,因为你正在运行测试,我想,否则分离另一个实体的每一个实体......)或使用DataLoadOptions非常麻烦。 LoadWith()或AssociateWith()以急切加载关系。