12

我有一个表,该表在具有序数列的表上具有唯一索引。因此,例如该表将具有以下列:

表 ID、ID1、ID2、序数

唯一索引跨 ID1、ID2、Ordinal 列。

我遇到的问题是,当从数据库中删除记录时,我会重新排序序数,以便它们再次连续。我的删除功能将如下所示:

    public void Delete(int id)
    {
        var tableObject = Context.TableObject.Find(id);
        Context.TableObject.Remove(tableObject);
        ResequenceOrdinalsAfterDelete(tableObject);
    }

问题是,当我调用 Context.SaveChanges() 时,它会破坏唯一索引,因为它似乎以与传递语句不同的顺序执行语句。例如,会发生以下情况:

  1. 重新排序序数
  2. 删除记录

代替:

  1. 删除记录
  2. 重新排序序数

这是 EF 的正确行为吗?如果是,有没有办法覆盖这种行为来强制执行顺序?

如果我没有正确解释这一点,请告诉我......

4

1 回答 1

13

命令顺序完全由 EF 控制。影响订单的唯一方法是为每个操作使用单独的 SaveChanges:

public void Delete(int id)
{
    var tableObject = Context.TableObject.Find(id);
    Context.TableObject.Remove(tableObject);
    Context.SaveChanges();
    ResequenceOrdinalsAfterDelete(tableObject);
    Context.SaveChanges();
}

您还应该在手动创建的事务中运行该代码以确保原子性 (=> TransactionScope)。

但是最好的解决方案可能是使用存储过程,因为您的重新排序必须将所有受影响的记录从数据库中提取到您的应用程序中,更改它们的序号并将它们一一保存回数据库。

顺便提一句。用数据库气味来做这件事。在您的“序数”序列中有间隙有什么问题?

于 2011-09-07T14:48:14.010 回答