如何使用Entity Framework处理数据表约束?

时间:2016-05-19 23:02:01

标签: sql entity-framework

我有一个数据表ClearingDetail,其中有一列OrdinalNumber - 它的目的仅仅是保持用户输入数据的顺序。

还有一个外键ClearingIdClearingDetail表具有唯一键,可确保该对(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)。

你能告诉我如何处理这个问题吗?

0 个答案:

没有答案