2009-11-06 121 views
2

当使用Linq2sql时,一切都自动运行。我的经验是,随着流程的发展并不总是最好的解决方案,并理解内部工作是如何更好,所以你最佳地使用技术。linq2sql如何跟踪数据库对象?

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

如果我做了一个查询并获得一些数据库对象,或者我创建了一个新对象,linqcontext对象不知何故地保持对这些对象的引用。如果其中一个对象发生了某些变化,则上下文对象'知道'发生了什么变化并需要更新。

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

如果不是,这是如何工作的?

此外,数据库对象总是遍历整个列表以查看更改和更新它是否不是很慢?

任何有关如何运作的见解将是非常好的!

谢谢

+0

你应该添加“linq-to-sql”标签到你的问题,因为它是特定于linq – 2009-11-06 19:34:08

+0

的味道marcel:好主意 – Toad 2009-11-06 19:34:41

+0

你误解了我,已经有一个标签“linq-to-sql”,你刚刚创建了一个新的标签;-) – 2009-11-06 20:05:12

回答

2

是的,上下文保持加载对象的引用。这就是为什么它不能用于与不同请求共享的单个实例的原因之一。

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

+0

你对不同请求的分享意味着什么? Shoudl为每个查询创建一个新的上下文? – Toad 2009-11-06 19:30:18

+0

@reinier在asp.net上(这可能不是你的情况),如果你为不同的请求保留相同的上下文实例,你将保留所有的跟踪对象。除了性能,考虑如果某些进程正在对某些db对象进行一些更改,并且由于某些验证您没有提交这些更改......那么在另一个进程中,您会执行一些无关的更改并在上下文中调用提交更改 - - 你会承诺你没有打算的其他改变。 – eglasius 2009-11-06 19:33:26

+0

是的,最好尽可能缩短您的数据上下文生命周期。 – 2009-11-06 19:34:51

2

DataContext注册到您的对象PropertyChanged事件以了解它何时被修改。此时,它会克隆原始对象,并在您执行SubmitChanges()时保留它以将两个对象进行比较。

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

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

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

+0

创建对象我的意思是从我的表格创建的dbml – Toad 2009-11-06 19:36:45

+0

@Marcel afaik当您将您自己的对象引用设置为null时,它不会删除未引用的对象。 – eglasius 2009-11-06 19:38:29

+0

感谢Freddy,我编辑了我的答案 – 2009-11-06 20:09:19