代码之家  ›  专栏  ›  技术社区  ›  Toad

Linq2SQL如何跟踪数据库对象?

  •  2
  • Toad  · 技术社区  · 15 年前

    当使用linq2sql时,一切都自动工作。我的经验是,随波逐流并不总是最好的解决方案,了解内部工作的方式更好,所以您可以优化地使用该技术。

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

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

    如果我对该对象的引用设置为空,这是否意味着上下文对象也会删除它与该对象的链接?或者,上下文对象是否正在缓慢地被大量引用填满,并且使我的数据库对象不被垃圾收集?

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

    另外,数据库对象总是浏览整个列表以查看更改的内容并对其进行更新,这不是很慢吗?

    任何有关这项工作的见解都将是极好的!

    谢谢

    2 回复  |  直到 15 年前
        1
  •  2
  •   eglasius    15 年前

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

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

        2
  •  2
  •   Marcel Gosselin    15 年前

    DataContext注册到对象 PropertyChanged 事件以了解它何时被修改。此时,它将克隆原始对象,并在以后执行以下操作时将两个对象保持在一起进行比较: SubmitChanges() .

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

    编辑 :没有。很抱歉我最初的回答我误解了你写的东西。在这种情况下,数据上下文仍然具有对这两个对象的引用,但将在下一个对象上删除与这两个对象的关系 子改变() .

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