在实体框架中使用唯一约束交换值我在Navigations表的一个名为Index的列上有一个唯一约束。我有两个导航实体,我想交换它们的索引值。当我调用db.SaveChanges时,它抛出一个异常,表明违反了唯一约束。似乎EF正在更新一个值,然后又更新另一个值,这违反了约束。它不应该在事务中更新它们,然后在值被编组并且没有违反约束时尝试提交吗?有没有办法在不使用临时值的情况下解决这个问题?这不是EF的问题,而是SQL数据库的问题,因为更新命令是按顺序执行的。交易与此无关——所有约束都是针对每笔交易而不是每笔交易进行验证的。如果你想交换唯一值,需要更多的步骤,所以使用其他虚拟值来避免这种情况。有几种方法。其中一些包含在其他答案和评论中,但为了完整起见,我将在此处列出它们(请注意,这只是我集思广益的列表,可能并不完全“完整”)。在一个命令中执行所有更新。有关此示例,请参见W0lf的回答。做两组更新——一组负值将所有值交换为期望值,然后花一秒钟将它们从负值转换为正值。这是在其他约束不阻止负值的假设下,并且它们不是瞬态以外的记录所具有的值。添加一个额外的列-例如IsUpdating-并在值更改的第一组更新中将其设置为true,然后在第二组更新中将其设置为false。将唯一约束交换为过滤的唯一索引,该索引忽略IsUpdating为真的记录。删除约束并处理重复值。您可以运行自定义SQL查询来交换值,如下所示:updateNavigationsetvaluecolumn=casewhenid=1then'value2'whenid=2then'value1'endwhereidin(1,2)然而,实体框架不能那样做,因为它超出了ORM的范围。它只是为每个被更改的实体执行顺序更新语句,就像Ladislav在他的回答中描述的那样。另一种可能性是在数据库中删除UNIQUE约束并依赖应用程序正确执行此约束。在这种情况下,EF可以很好地保存更改,但根据您的情况,这可能是不可能的。以上就是C#学习教程:EntityFramework中用唯一约束交换值的所有分享内容,如果对大家有用,还需要详细了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
