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

问题描述 投票:0回答:1

我有一个复合唯一的表,我想允许用户交换序列号,但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:违反UNIQUE KEY约束'UX_RateCodes_Sequence'。无法在对象'dbo.RateCodes'中插入重复键。重复键值为(346,3)

尽管我正在同时保存所有内容,但SQL会抛出一个唯一的违规行为,因为SQL会在更新所有数据之前执行唯一的密钥验证。

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

c# sql entity-framework
1个回答
1
投票

我该如何解决这个问题?

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

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

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

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

在一个声明中执行录制。您可以使用重新映射值的临时表执行相同的模式。但所有这些都需要一定程度的直接SQL编码。

© www.soinside.com 2019 - 2024. All rights reserved.