我有一个数据表ClearingDetail
,其中有一列OrdinalNumber
- 它的目的仅仅是保持用户输入数据的顺序。
还有一个外键ClearingId
。 ClearingDetail
表具有唯一键,可确保该对(ClearingId, OrdinalNumber
)没有重复项。
为了说明问题,我们假设我们有三条记录:
ClearingDetailId ClearingId OrdinalNumber SomeDetails
1 101 1 Details1
2 101 2 Details2
3 101 3 Details3
现在,用户删除了第一条记录,因此在重新编号OrdinalNumber
后,该表应该包含
ClearingDetailId ClearingId OrdinalNumber SomeDetails
2 101 1 Details2
3 101 2 Details3
我正在使用Entity Framework来处理数据库操作。我的代码如下所示:
using (var scope = new TransactionScope())
{
RemoveClearingDetailById(1);
entities.SaveChanges();
RenumerateClearingDetails(101);
entities.SaveChanges();
scope.Complete();
}
RemoveClearingDetailById如下所示:
void RemoveClearingDetailById(DbContext entities, int id)
{
var detailToRemove = entities.ClearingDetails.FirstOrDefault(x=>x.ClearingDetailId == id);
entities.ClearingDetails.Remove(detailToRemove);
}
RenumerateClearingDetails看起来像这样:
void RenumerateClearingDetails(DbContext entities, int id)
{
var i = 0;
foreach(var detail in entities.ClearingDetails.Where(x=>x.ClearingId == id)
{
detail.OrdinalNumber = ++i;
}
}
不幸的是,我收到了一条消息:
违反UNIQUE KEY约束'IX_UniqueOrdinalNumberWithinClearingId'。
无法在对象'dbo.ClearingDetail'中插入重复键 重复键值为(101,1)。
你能告诉我如何处理这个问题吗?