linq2sql如何跟踪数据库对象?

时间:2009-11-06 19:24:52

标签: c# .net linq linq-to-sql internals

使用Linq2sql时,一切都自动运行。我的经验是,顺应流程并不总是最好的解决方案,并且了解内部工作的方式更好,因此您可以最佳地使用该技术。

所以,我的问题是关于linq2sql。

如果我进行查询并获取一些数据库对象,或者我创建了一个新的数据库对象,那么linqcontext对象会以某种方式保留对这些对象的引用。如果其中一个对象发生变化,则上下文对象“知道”已更改的内容并需要更新。

如果我对该对象的引用设置为null,这是否意味着上下文对象还删除了它对该对象的链接?或者上下文对象是否慢慢充满了大量的引用,并使我的数据库对象不被垃圾收集?

如果没有,这是如何工作的?

此外,数据库对象总是通过整个列表来查看更改内容并更新它并不是很慢吗?

任何有关如何运作的见解都会非常好!

感谢

2 个答案:

答案 0 :(得分:2)

是的,上下文保留了已加载对象的引用。这就是为什么它不适合与不同请求共享的单个实例一起使用的原因之一。

它保留了插入/删除的列表。我不确定它是否捕获更新将这些添加到列表中,或者它在最后循环。但是,你不应该一次加载大量的数据,因为仅仅这一点对性能的影响要大于它在列表中可能进行的最后一次检查。

答案 1 :(得分:2)

DataContext向对象PropertyChanged事件注册,以了解它何时被修改。此时,它会克隆原始对象,并在您SubmitChanges()执行SubmitChanges()后将其保持比较。

  

如果我对该对象的引用设置为null,这是否意味着上下文对象还会删除它与此对象的链接?

修改:不。很抱歉我原来的回答是我误解了你所写的内容。在这种情况下,数据上下文仍然具有对两个对象的引用,但将删除与下一个{{1}}上的这两个对象的关系。

但要小心。如果你创建自己的对象而不是使用.dbml生成的对象,那么datacontext执行的“魔法”可能无法正常工作。