我的表格如下所示:
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(并删除旧的)会是一个更好的解决方案,还是不会工作?
目前,“解决方案”是从数据库中删除唯一约束(但我不愿意这样做)。
答案 0 :(得分:3)
一种选择是创建一个事务(连接绑定事务或TransactionScope
) - 删除记录和SubmitChanges
,添加记录和SubmitChanges
,然后最后提交事务(如果你爆炸,则回滚)。
请注意,您可以通过数据上下文构造函数IIRC关联连接绑定事务。 TransactionScope
也应该有效,而且更容易做到 - 但效率不高。
或者,编写一个在数据库中执行此交换作业的SP,并通过数据上下文访问该SP 。
答案 1 :(得分:1)
我遇到了同样的问题。最后编写了一个包装类,其中包含我保留的“已添加”和“已删除”实体集合。以及“当前”系列。 UI已绑定到当前集合。
只有当我去保存时才会插入InsertOnSubmit / DeleteOnSubmit,并解析2个集合来决定哪些实体要做什么。