1

我们正在考虑使用实体框架进行批量上传作业。因为我们对跟踪每个记录的单个结果感兴趣,所以我试图找出是否所有插入的项目都作为事务的一部分完成,以及单个故障是否会导致回滚,或者是否有跟踪结果的方法每个单独的结果。

我正在考虑只循环遍历项目并在每个项目上调用 Save() 并将其包装在 try/catch 块中,但如果我可以利用各个结果,仅在上下文中调用 save() 似乎更有效。

谢谢!

4

1 回答 1

3

默认情况下,每次调用时,SaveChanges所有待处理的记录都会立即保存。调用中的所有操作SaveChanges都在事务(source)中,因此如果特定的 SaveChanges 调用失败,它将回滚该特定调用中的查询,但显然不是以前成功的调用。

最终,这取决于您调用 SaveChanges 的位置以及您将获得多少回滚。TransactionScope您可以通过查看这篇文章来扩展事务的长度,以获取有关如何扩展范围的一些示例。

我自己的经验是,过于频繁地调用 SaveChanges 确实会降低性能,并大大减慢整个过程。但显然等待太久可能意味着更大的内存占用。我发现 EF 可以轻松处理数千行而不会出现太多内存问题。

将代码放在 try...catch 中会对您有所帮助,但您可能希望查看实体验证,因为您可以对对象设置限制,然后在生成任何 SQL 之前对对象进行验证。

于 2012-10-25T13:32:31.297 回答