Navigations
我对表的列有一个唯一约束,称为Index
. 我有两个Navigation
实体,我想交换它们的Index
值。
当我调用db.SaveChanges
它时会抛出一个异常,表明违反了唯一约束。似乎 EF 正在更新一个值,然后是另一个值,因此违反了约束。
它不应该在事务中更新它们,然后在整理出值并且不违反约束后尝试提交吗?
有没有办法在不使用临时值的情况下解决这个问题?
Navigations
我对表的列有一个唯一约束,称为Index
. 我有两个Navigation
实体,我想交换它们的Index
值。
当我调用db.SaveChanges
它时会抛出一个异常,表明违反了唯一约束。似乎 EF 正在更新一个值,然后是另一个值,因此违反了约束。
它不应该在事务中更新它们,然后在整理出值并且不违反约束后尝试提交吗?
有没有办法在不使用临时值的情况下解决这个问题?
这不是 EF 的问题,而是 SQL 数据库的问题,因为更新命令是按顺序执行的。事务与此无关 - 所有约束都是按命令而不是按事务验证的。如果您想交换唯一值,您需要更多步骤,您将使用额外的虚拟值来避免这种情况。
您可以运行自定义 SQL 查询来交换值,如下所示:
update Navigation
set valuecolumn =
case
when id=1 then 'value2'
when id=2 then 'value1'
end
where id in (1,2)
但是,实体框架不能这样做,因为它超出了 ORM 的范围。update
它只是为每个更改的实体执行顺序语句,就像 Ladislav 在他的回答中描述的那样。
另一种可能性是删除UNIQUE
数据库中的约束并依靠应用程序正确执行此约束。在这种情况下,EF 可以很好地保存更改,但根据您的情况,这可能是不可能的。
有几种方法。其中一些包含在其他答案和评论中,但为了完整起见,我将在此处列出它们(请注意,这只是我集思广益的列表,可能并不那么“完整”)。