DbContext SaveChanges语句执行顺序

时间:2011-09-07 14:27:41

标签: entity-framework-4 ef-code-first ef4-code-only dbcontext

我有一个表,在具有Ordinal列的表上具有唯一索引。例如,表格将包含以下列:

TableId,ID1,ID2,Ordinal

唯一索引跨越ID1,ID2,Ordinal列。

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

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

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

  1. 重新排列普通篇
  2. 删除记录
  3. 而不是:

    1. 删除记录
    2. 重新排列普通篇
    3. 这是EF的正确行为吗?如果是,是否有一种方法可以覆盖此行为以强制执行顺序?

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

1 个答案:

答案 0 :(得分:11)

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

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

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

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

顺便说一下。这样做与数据库气味。在你的“序数”序列中有一个缺口是什么问题?