我正在使用事务在多个表中插入多行。对于这些行,我想按顺序添加这些行。在调用SaveChanges时,所有行都不按顺序插入。
如果不使用交易并在每次插入后保存更改都会保持订单,但我确实需要为所有条目进行交易。
答案 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。不确定为什么你提到你在“辩论”这个。 =)