Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中的复合唯一更新冲突_C#_Sql_Entity Framework - Fatal编程技术网

C# 实体框架中的复合唯一更新冲突

C# 实体框架中的复合唯一更新冲突,c#,sql,entity-framework,C#,Sql,Entity Framework,我有一个具有复合唯一性的表,我希望允许用户交换序列号,但SQL会抛出唯一键冲突。可能是因为在每行更改后都会检查违规行为 public class RateCodes { public int Id { get; set; } //Unique Composite Key Field 1 public int Sequence { get; set; } //Unique Composite Key Field 2 public int DivisionId { ge

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

public class RateCodes
{
   public int Id { get; set; }
   //Unique Composite Key Field 1
   public int Sequence { get; set; }
   //Unique Composite Key Field 2
   public int DivisionId { get; set; }
   public Decimal RateCode { get; set; }
}
在我们的客户机中,我们希望允许用户重新排序他们的费率代码序列

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

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

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

System.Data.SqlClient.SqlException:违反唯一键约束“UX_RateCodes_Sequence”。无法在对象“dbo.RateCodes”中插入重复键。重复键值为(346,3)

尽管我一次保存所有数据,但是SQL抛出了一个唯一的冲突,因为SQL在更新所有数据之前执行唯一密钥验证

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

我如何解决这个问题

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

通过建模解决这个问题的一个简单方法是引入一个新的非键属性来存储排序。这还有一个额外的好处,即允许您对排序列使用十进制或浮点,因此您总是在两个现有项之间插入一个in项

另一个想法是使用新属性来存储待排序的,在一系列更新和删除之后,发出一个

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

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

为什么不更新现有记录,而不是插入新记录,然后删除旧记录?@Marathon55我正在更新现有记录,他们正在抛出唯一选项,因为SQL在更新所有数据之前执行唯一键验证,尽管一次保存所有数据。是否使用
UpdateRange
方法?如果是这样,也许您可以一次一个地循环并更新它们。@Marathon55循环它们会导致相同的问题,因为您有一个Id=34的现有记录6和Sequence=3。您想更改该记录的RateCode值,对吗?谢谢,还有一个想法,但我怎么能有一个唯一的非键属性,由另一个字段分割?它不会是唯一的。允许重复会使更新变得简单。如果您需要对其施加完整、稳定的排序,您可以使用键值打破关系检索。这没有意义,你可能有一个稳定的排序,但它不能使它成为正确的排序。假设发生更新异常,放入重复的序列号,因此你按键排序,但这假设插入顺序是正确的,而不是抛出错误,你向此人支付错误的费率如果您处于控制状态,并且您的代码是事务性的,则可能会发生异常?@Aldert 2人同时更新同一资源