我正在使用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
因那个而失败,同样的错误。好像上下文中仍然有新对象,并尝试在下一次循环时重新保存它们。因此,在回滚过程中,如何告诉上下文忘记这些对象,以便继续循环?
答案 0 :(得分:3)
SaveChanges
将您的内存中对象与数据库同步。您已将对象添加到内存模型中。它们永远不会消失,直到你删除它们。
添加对象不对插入进行排队。它只是添加一个对象。在插入之前SaveChanges
将尝试将数据库置于最新状态。
EF不是可以将写入队列的CRUD助手。它试图在概念上镜像内存中的数据库。 SaveChanges
只是执行了必要的DML。
每行使用一个上下文。