【问题标题】:Row insertion order entity framework行插入顺序实体框架
【发布时间】:2009-05-28 15:20:54
【问题描述】:

我正在使用事务在多个表中插入多行。对于这些行,我想按顺序添加这些行。在调用 SaveChanges 时,所有行都被乱序插入。

当不使用事务并在每次插入后保存更改时确实保持顺序,但我确实需要所有条目的事务。

【问题讨论】:

  • 为什么插入 SQL 数据库的顺序很重要?
  • 插入顺序无关紧要,但主键的顺序很重要。

标签: entity-framework transactions insert


【解决方案1】:

实体框架中的插入/更新和删除顺序取决于实体框架中的许多东西。

例如,如果您在新类别中插入新产品,我们必须在产品之前添加类别。

这意味着,如果您有大量更改,那么我们必须首先满足局部排序约束,而这确实是我们所做的。

您在上下文中执行操作的顺序可能与这些规则相冲突。例如,如果您这样做:

ctx.AddToProducts(
   new Product{
      Name = "Bovril",
      Category = new Category {Name = "Food"}
   }
);

效果是先添加产品(到上下文中),然后当我们遍历图表时,我们也添加类别。

即插入上下文的顺序是:

Product
Category

但由于参照完整性限制,我们必须在尝试插入数据库之前像这样重新排序:

Category
Product

所以这种本地重新排序是不可协商的。

但是,如果没有像这样的本地依赖项,理论上您可以保留顺序。不幸的是,我们目前不跟踪“何时”将某些内容添加到上下文中,并且出于效率原因,我们不跟踪实体以保留列表等结构。因此,我们目前无法保留不相关插入的顺序。

但是我们最近还在讨论这个问题,所以我很想知道这对你有多重要?

希望对你有帮助

亚历克斯

项目经理实体框架团队

【讨论】:

  • 感谢您的解释。如果支持它肯定会节省我一些时间,但我想我也可以生成自己的自定义主键来达到相同的效果。
  • 下面的问题还有一些其他的回答。我通过订购时间戳或其他什么而不是主键来解决这个问题。
  • 这有什么更新吗?我有一种情况,我的表对备用键有约束,因此模型上没有可见的关系。 (A.K. 是 userName,而不是 userId)。那么如何更改插入顺序,截至目前,当我添加用户然后将用户添加到组时,savechanges 失败。
  • 在原子插入对象图时,我们使用自动增量列作为“创建/插入顺序”的代理。因此,目前这对我们在 EF 中不起作用。根据依赖关系更改插入顺序很好,但保留插入顺序会很好,这样我们就可以重用这个自动增量列,而不是引入 SortOrder/CreationOrder 列和另一个 EF 解决方法。目前,在满足依赖关系之后,似乎对象是按照它们的 EntityKey 顺序而不是创建顺序插入的。
  • 在调用 SaveChanges() 时,有什么方法可以访问将对象保存到数据库的顺序?我们已经通过覆盖对它们进行了迭代,但是如果我们可以按照保存它们的相同顺序对它们进行迭代,这将有助于解决我们的其他一些问题。
【解决方案2】:

我正在过这座桥。我正在用 EF 替换 NHibernate,我遇到的问题是如何将列表插入数据库。如果我将项目添加到这样的列表中(在伪代码中):

list.Add(testObject); list.Add(testObject1);

目前无法保证在运行“SaveChanges”时获得相同的订单。很遗憾,因为我的列表对象(即链表)知道它的创建顺序。使用引用链接在一起的对象必须以相同的顺序保存到数据库中。不知道你为什么提到你正在“辩论”这个。 =)

【讨论】:

  • 不确定当你在这里回复时他是否会注意到,你可能也应该评论他的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2011-07-27
相关资源
最近更新 更多