2

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

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

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

如果我对该对象的引用设置为 null,这是否意味着上下文对象也删除了它与该对象的链接?还是上下文对象慢慢地被大量引用填充,并阻止我的数据库对象进行垃圾收集?

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

另外,数据库对象总是遍历整个列表以查看发生了什么变化并对其进行更新不是很慢吗?

任何有关其工作原理的见解都会非常好!

谢谢

4

2 回答 2

2

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

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

于 2009-11-06T19:27:52.357 回答
2

DataContext 注册到您的对象PropertyChanged事件以了解它何时被修改。此时它会克隆原始对象并保留它以便稍后在您执行SubmitChanges().

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

编辑:不。对不起我原来的回答我误解了你写的东西。在这种情况下,数据上下文仍然对这两个对象都有引用,但会在 next 上删除与这两个对象的关系SubmitChanges()

不过要小心。如果您创建自己的对象而不是使用从 .dbml 生成的对象,则数据上下文执行的“魔术”可能无法正常工作。

于 2009-11-06T19:32:43.490 回答