2014-10-30 72 views
2

我正在使用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

所以你得到一个异常,然后代码继续在你的for/next循环中? – DavidG 2014-10-30 10:56:17

+0

@DavidG:确实如此。但如果有更好的方法,我不会重视那个设计。 – 2014-10-30 11:18:14

回答

3

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

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

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

每行使用一个上下文。

+1

这正是问题所在,你的解决方案解决了这个问题。还要感谢我做错了什么的概念性解释。 – 2014-10-30 12:39:03

相关问题