如何在实体框架中保存更改时禁用唯一约束

时间:2017-03-30 15:25:00

标签: sql entity-framework

我在Entity Framework 6和SQL Server中遇到了一个有趣的问题。

我们有一个带有复合键的表。这是一个例子;

ID  Col1  Col2
--  ----  ----
1   1     1
2   1     2
3   2     1
4   2     2
5   2     3

因此,Col2对于每个Col1都是唯一的。我需要交换2个值来产生这个期望的结果......

ID  Col1  Col2
--  ----  ----
1   1     2
2   1     1

我正在使用Entity Framework,从数据库加载对象,进行更改,并调用SaveChanges。

我收到异常:“违反UNIQUE KEY约束'UQ_TableA_Constraint1'。无法在对象'dbo.TableA'中插入重复键。”

据说,在事务中调用SaveChanges。 EF Source似乎表明它是,并且更新失败是原子的事实表明这是有效的。但是,即使在交易中,似乎ROW BY ROW也会完成更新。因此,EF首先对记录1执行更新,暂时产生重复的唯一密钥。

有没有办法减轻这个?我宁愿不更新为临时值,调用savechanges,然后更新为正确的值,因为这可能会失败并使数据保持不正确状态。

有没有选择?

1 个答案:

答案 0 :(得分:0)

我希望我理解你的问题 在事务内部也必须满足约束,这是SQL Server(和其他DBMS)行为而不是EF行为 您可以在事务中使用临时值以确保一切顺利 如果您需要运行更新查询(在多个记录上),您可以使用外部库https://github.com/loresoft/EntityFramework.Extended(但如果我理解您的问题,您将无法解决约束问题)。