【问题标题】:how does linq2sql keep track of database objects?linq2sql 如何跟踪数据库对象?
【发布时间】:2009-11-06 19:24:52
【问题描述】:

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

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

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

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

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

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

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

谢谢

【问题讨论】:

  • 您应该将“linq-to-sql”标签添加到您的问题中,因为它是特定于 linq 风格的
  • 你误会了,已经有一个标签“linq-to-sql”,你刚刚创建了一个新标签;-)
  • 哈哈哈......好吧......也许我现在得到一个新徽章! ;^)

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


【解决方案1】:

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

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

【讨论】:

  • 不同请求之间的共享是什么意思?你应该为每个查询创建一个新的上下文吗?
  • @reinier 在 asp.net 上(可能不是您的情况),如果您为不同的请求保留相同的上下文实例,则您将所有跟踪的对象都保留在其中。除了性能之外,考虑如果某个进程正在对某些 db 对象进行一些更改并且由于某些验证您没有提交这些更改......然后在另一个进程中,您进行一些不相关的更改并在上下文中调用提交更改 - - 你将提交那些你不打算做的其他更改。
  • 是的,最好尽可能缩短数据上下文的生命周期。
  • freedy,marcel:从不知道上下文应该是短暂的
  • y msdn.microsoft.com/en-us/library/… - “典型的 LINQ to SQL 应用程序在方法范围内创建 DataContext 实例,或者作为代表一组相关数据库操作的逻辑集的短期类的成员创建 DataContext 实例”。根据 Marcel 的评论,该提示甚至比我给出的典型用法还要短。
【解决方案2】:

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

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

编辑:不。对不起,我最初的回答是我误解了你写的内容。在这种情况下,数据上下文仍然具有对这两个对象的引用,但将在下一个 SubmitChanges() 删除与这两个对象的关系。

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

【讨论】:

  • 创建对象是指 dbml 从我的表中创建的对象
  • @Marcel afaik 当您将自己的对象引用设置为 null 时,它不会删除未引用的对象。
  • @reinier 因为您使用了从 VisualStudio 创建的对象,所以所有更新都应该可以正常工作。对于插入和删除,您将需要使用 InsertOnSubmit()DeleteonSubmit()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2021-05-16
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多