实体框架中的复合唯一更新违规

时间:2018-09-05 16:51:20

标签: c# sql entity-framework

我有一个表,该表具有唯一的组合,我希望允许用户交换序列号,但是SQL会抛出唯一的键冲突。大概是因为在每次更改行后都会检查违规情况

// unCamelCase.js

function unCamelCase(val) {
    return val.replace(/([a-z])([A-Z])/g, '$1 $2')
         .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
         .replace(/^./, function(str){ return str.toUpperCase();   })
}

module.exports = unCamelCase

在我们的客户中,我们希望允许用户重新排列其费率代码的顺序。

但是,当我执行更新时,会出现异常

  

“ System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常。

     

System.Data.Entity.Core.UpdateException:更新条目时发生错误。有关详细信息,请参见内部异常。

     

System.Data.SqlClient.SqlException:违反UNIQUE KEY约束'UX_RateCodes_Sequence'。无法在对象'dbo.RateCodes'中插入重复的密钥。重复的键值为(346,3)

尽管我一次保存了所有事实,但是SQL引发了唯一冲突,因为SQL在更新所有数据之前执行了唯一密钥验证。

我不想在保存之前删除我的数据,因为其他应用程序可能正在该表上运行,并且我可能没有当前应用程序中的所有数据。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

如何解决此问题?

如上所述,这不是一个非常容易解决的问题。更新密钥本质上是有问题的,唯一的约束是不可延迟的。

通过建模解决此问题的一种简单方法是引入一个新的非关键属性来存储排序。这样做还有一个好处,就是允许您在排序列中使用小数或浮点数,因此您始终可以在两个现有项目之间插入项目。

另一种想法是使用new属性存储待定订单,在进行一系列更新和删除后,发出一个

update RateCodes set sequence = sequence_new 
where id = @id and sequence_new is not null

在单个语句中执行记录。您可以使用重新映射值的临时表执行相同的模式。但是,所有这些都需要某种程度的直接SQL编码。