【问题标题】:How do I get to the bottom of this Linq to SQL error?如何深入了解此 Linq to SQL 错误?
【发布时间】:2009-11-20 17:29:43
【问题描述】:

已尝试附加或 添加一个不是新的实体,也许 从另一个加载 数据上下文。这不受支持。

使用 Linq to SQL 已经有一段时间了,我相信我知道它的局限性,并且我在编写新代码时会遵守规则。但是得到这个异常是令人沮丧的,因为没有迹象表明是哪个对象导致了违规。在具有多个 DC 的复杂数据操作场景中,我只能考虑反复试验来缩小可能的罪魁祸首。有没有办法了解更多?

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    如果您将一个对象附加到您的 DataContext,它必须是您使用 new 运算符创建的。如果从 DataContext 中读取对象,则必须将其保存到同一个 DataContext。

    为了缓解这类问题,我总是使用单个 DataContext,并且我在“工作单元”的基础上做所有事情。

    一般来说,这意味着,在任何给定时间,我都在读取我需要的记录、对这些记录执行工作并保存更改,所有这些都在一个工作单元中,使用单个 DataContext。由于它是一个工作单元,它不会渗透到其他 DataContext 对象中。

    如果 Linq to SQL 在这方面与您抗衡,我会检查您的架构,看看您的操作方式是否最佳,尤其是当您发现难以识别导致错误的对象时。一般来说,很难在 DataContext 之间共享对象。你可以做到(使用“附加”和“分离”之类的东西),但这很麻烦。

    【讨论】:

    • 我还没有找到在有状态 Web 应用程序中重新附加分离对象的方法。我有一个可靠的解决方案。在这种情况下,我试图做一些“子单元”来操作由主数据上下文获得的数据。似乎这是不可能的。如果我在一个数据上下文中加载一个实体,然后在另一个数据上下文中对其进行更改,我会在最终的 SubmitChanges() 中收到此错误。看来我必须确保工作的每个“子单元”都自己处理所有事情。感谢您的建议。
    • 如果您仍想使用原始数据对象,您可以将原始 DataContext 作为参数传递给您的子单元。但是,是的,我一般同意子单元是自包含的前提。
    • 我正是通过这样做解决了这个问题,但我仍然想知道是否有办法找出导致此异常的对象。
    • 我不知道。您必须在代码中添加 SubmitChanges() 调用,直到您能够将罪魁祸首的对象括起来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多