entity-framework-4 - DbContext SaveChanges 语句执行顺序

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

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

TableId、ID1、ID2、序号

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

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

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

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

  • 代替:
  • 删除记录
  • 对序数重新排序

  • 这是 EF 的正确行为吗?如果是,是否有办法覆盖此行为以强制执行顺序?

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

    最佳答案

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

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

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

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

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

    关于entity-framework-4 - DbContext SaveChanges 语句执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335582/

    相关文章:

    c# - 使用 ASP.Net 和 Entity Framework : adding a child object in a 1:1 relationship

    asp.net-mvc - 具有单例 DbContext 的自定义 RoleProvider 可能与 MVC3 网站中的 PerRequest DbContext 冲突

    c# - EF Code First 实现接口(interface)属性

    code-first - 从 IQueryable 访问 DbContext

    c# - 如何在仅 EF4.1 代码场景中重用部分 Linq to Entity Select 表达式

    c# - 如何找到EF CodeFirst CTP5中针对更改进行跟踪的所有对象的来源?

    c# - self 跟踪实体 SaveChanges() 在多对多关系中添加实体时出现异常

    c# - 如何配置 EF 自动填充子外键

    c# - EF DbContext 和 Ninject

    orm - Entity Framework 4 代码仅从 POCO 域对象的 MetaData 获取表名