行插入顺序实体框架

时间:2009-05-28 15:20:54

标签: entity-framework transactions insert

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

如果不使用交易并在每次插入后保存更改都会保持订单,但我确实需要为所有条目进行交易。

2 个答案:

答案 0 :(得分:10)

在实体框架中进行的订单插入/更新和删除取决于实体框架中的许多内容。

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

这意味着如果你有一大组更改,我们必须首先满足本地排序约束,这实际上就是我们所做的。

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

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

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

即。插入顺序进入上下文是:

Product
Category

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

Category
Product

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

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

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

希望这有帮助

亚历

项目经理实体框架小组

答案 1 :(得分:1)

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

list.Add(的TestObject); list.Add(testObject1);

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