Linq2SQL处理具有唯一约束的表上的插入/删除

时间:2009-04-28 09:22:20

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

我的表格如下所示:

TABLE Foo
{
  Guid Id [PK],
  int A [FK],
  int B [FK],
  int C [FK],
}

对A,B和C的唯一约束。

现在说,例如,你插入一个新的PK行,其中A = 1,B = 1,C = 1.

SubmitChanges(),都很高兴。

现在编辑表格。

删除上一个条目,并插入一个带有F = +的行,A = 1,B = 1,C = 1.

SubmitChanges()砰!唯一键约束SQL异常。

从我所看到的,它尝试首先插入新记录,然后尝试删除前一个记录。我甚至可以理解,无法确定需要发生的顺序。

但我该怎么办呢?将这三个领域作为复合PK(并删除旧的)会是一个更好的解决方案,还是不会工作?

目前,“解决方案”是从数据库中删除唯一约束(但我不愿意这样做)。

2 个答案:

答案 0 :(得分:3)

一种选择是创建一个事务(连接绑定事务或TransactionScope) - 删除记录和SubmitChanges,添加记录和SubmitChanges,然后最后提交事务(如果你爆炸,则回滚)。

请注意,您可以通过数据上下文构造函数IIRC关联连接绑定事务。 TransactionScope也应该有效,而且更容易做到 - 但效率不高。

或者,编写一个在数据库中执行此交换作业的SP,并通过数据上下文访问该SP

答案 1 :(得分:1)

我遇到了同样的问题。最后编写了一个包装类,其中包含我保留的“已添加”和“已删除”实体集合。以及“当前”系列。 UI已绑定到当前集合。

只有当我去保存时才会插入InsertOnSubmit / DeleteOnSubmit,并解析2个集合来决定哪些实体要做什么。