使用Linq to SQL“在一组更改中检测到一个循环”

时间:2013-08-09 07:18:38

标签: vb.net linq linq-to-sql submitchanges

我正在开发一个应用程序,在该应用程序中,我在调用DataContext.SubmitChanges()时遇到异常“在更改集中检测到循环”。我知道为什么会抛出这个异常,但我无法找到解决方案。让我解释一下情况。我有一个带有表的数据库,如下所示,我使用LINQ to SQL访问它,因此它被映射到vb.net中的类。

Device
-------
ID
DefaultGatewayID

DefaultGatewayID是一个设备甚至可以是同一个对象或另一个设备。用户使用带有DataGrid的GUI来更改和添加新记录。更新记录没有问题。 ID已存在,DefaultGatewayObject附加到记录(ID存储在数据库中)。

然而,当我尝试添加新记录并在同一事务中设置DefaultGatewayObject时,我得到“在变更集中检测到循环” - 异常。我怀疑这是由LINQ to SQL引起的,因为它不知道首先添加哪条记录,尽管在这种情况下它是相同的项目。

我没有选择break the insertion into two parts,一个用于设备,然后添加DefaultGateway,因为我的提交按钮绑定到执行SubmitChanges的XAML命令。

理想情况下,我会有一些选项来指定首先创建哪个对象,或类似的东西。我认为可以选择删除与自身的连接,只需在此字段中设置ID,但我宁愿在LINQ to SQL中找到修复。

我希望SO能回答这个问题。我只能找到相关的帖子"Cycle detected while adding Circularly linked list"

1 个答案:

答案 0 :(得分:1)

如果将代码包装在TransactionScope中,您可以将插入分为两部分,并且仍有一个事务。

Using trans As New TransactionScope()
    'Code that generates a new ID in the database
    dc.SubmitChanges()

    'Code that uses the new ID value.
    dc.SubmitChanges()

    trans.Complete()
End Using

这是避免异常的唯一方法。如果由于架构决策(“我的提交按钮绑定到XAML命令”)这是不可能的,您需要更改架构。我认为UI命令永远不应该如此接近数据访问层。您最好从XAML调用服务方法。