在Entity Framework中交换具有唯一约束的值
我对Navigations
表的名为Index
的列有一个唯一约束。 我有两个Navigation
实体,我想交换他们的Index
值。
当我调用db.SaveChanges
它会抛出一个exception,指示违反了唯一约束。 似乎EF正在更新一个值然后另一个值,从而违反了约束。
它不应该在事务中更新它们,然后在值被整理并且不违反约束时尝试提交吗?
有没有办法解决这个问题而不使用临时值?
这不是EF的问题,而是SQL数据库的问题,因为更新命令是按顺序执行的。 事务与此无关 – 所有约束都是针对每个事务而不是每个事务validation的。 如果要交换唯一值,则需要更多步骤,以便使用其他虚拟值来避免这种情况。
有几种方法。 其中一些内容包含在其他答案和评论中,但为了完整起见,我会在此列出它们(请注意,这只是我头脑风暴的列表,可能不完全是’完整’)。
- 在单个命令中执行所有更新。 有关此示例,请参阅W0lf的答案 。
- 做两组更新 – 一组用于将所有值交换为预期值的负数,然后用一秒钟将它们从负数转换为正数。 这是在假设其他约束不会阻止负值的假设,并且它们不是除瞬态状态之外的记录所具有的值。
- 添加一个额外的列 – 例如IsUpdating – 在更改值的第一组更新中将其设置为true,然后在第二组更新中将其设置为false。 为过滤的唯一索引交换唯一约束,该索引忽略IsUpdating为true的记录。
- 删除约束并处理重复值。
您可以运行自定义SQL查询来交换值,如下所示:
update Navigation set valuecolumn = case when id=1 then 'value2' when id=2 then 'value1' end where id in (1,2)
但是,entity framework不能这样做,因为它超出了ORM的范围。 它只是为每个被改变的实体执行顺序update
语句,就像Ladislav在他的回答中所描述的那样。
另一种可能性是在数据库中删除UNIQUE
约束并依赖应用程序来正确实施此约束。 在这种情况下,EF可以很好地保存更改,但根据您的方案,可能无法实现。
上述就是C#学习教程:在Entity Framework中交换具有唯一约束的值分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1041845.html