为什么我无法从事务回滚中恢复?

时间:2014-10-30 10:49:08

标签: asp.net .net entity-framework entity-framework-6

我正在使用Entity Framework 6并遇到无法从回滚交易中恢复的情况。

我需要遍历一个列表,并为每个项目添加一些条目到两个表。我的代码大致如下:

Dim db = New Data.Context

Try
    For Each item in list
        Using tx = db.Database.BeginTransaction
            'add objects to table 1

            'add objects to table 2

            db.SaveChanges()
            tx.Commit() 
        End Using
    Next
Catch ex As Exception
    'record the error
End Try

我希望它会循环遍历整个列表,并在SaveChanges成功时添加条目,并在失败时记录它们。

但是,只要SaveChanges调用失败,事务就会回滚,然后移动到列表中的下一个项目,然后SaveChanges那个而失败,同样的错误。好像上下文中仍然有新对象,并尝试在下一次循环时重新保存它们。因此,在回滚过程中,如何告诉上下文忘记这些对象,以便继续循环?

1 个答案:

答案 0 :(得分:3)

SaveChanges将您的内存中对象与数据库同步。您已将对象添加到内存模型中。它们永远不会消失,直到你删除它们。

添加对象对插入进行排队。它只是添加一个对象。在插入之前SaveChanges将尝试将数据库置于最新状态。

EF不是可以将写入队列的CRUD助手。它试图在概念上镜像内存中的数据库。 SaveChanges只是执行了必要的DML。

每行使用一个上下文。