我对名为Navigations
的{{1}}表格列有唯一约束。我有两个Index
个实体,我想交换他们的Navigation
值。
当我调用Index
时,它会抛出异常,表明违反了唯一约束。似乎EF正在更新一个值然后另一个值,从而违反了约束。
它不应该在事务中更新它们,然后在值被整理出来并且不违反约束条件时尝试提交吗?
如果不使用临时值,有没有解决方法?
答案 0 :(得分:9)
这不是EF的问题,而是SQL数据库的问题,因为更新命令是按顺序执行的。事务与此无关 - 所有约束都是针对每个事务而不是每个事务验证的。如果要交换唯一值,则需要更多步骤,以便使用其他虚拟值来避免这种情况。
答案 1 :(得分:3)
有几种方法。其中一些内容包含在其他答案和评论中,但为了完整起见,我会在此列出它们(请注意,这只是我头脑风暴的一个列表,可能不是全部'完成')。
答案 2 :(得分:2)
您可以运行自定义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可以很好地保存更改,但根据您的情况,可能无法实现。