如何在EF 6中使用事务保存列表

本文关键字:事务 保存 列表 EF | 更新日期: 2023-09-27 18:10:55

我正试图找到最合适的方法来保存使用EF6的订单列表和付款之一。我想知道下面的示例代码是否正确,例如,如果foreach循环在正确的地方?

using (ContextDB db = new ContextDB())
{
   foreach (Order item in orders)
      {
          using (var dbContextTransaction = db.Database.BeginTransaction())    
          {
              try
              {               
                  // some logic here to retrieve related payment, etc...
                   ...
                   db.Orders.Add(item);
                   db.Payments.Add(pmntRcvd) 
                   db.SaveChanges();   
                   dbContextTransaction.Commit();
               }
               catch
               {
                   // Code to log the exception
                   ...                        
                }  
           }   
      }
}

如何在EF 6中使用事务保存列表

  1. 您在单独的交易中保存项目。这应该是显而易见的:您为每个项目创建一个事务。
  2. 不需要Rollback。如果不执行Commit,则总是会发生回滚。请删除所有错误处理代码。
  3. 你吞下异常,这样你就永远不会发现问题。
  4. 我不明白你为什么经常打电话给SaveChanges。为什么不在最后说一次呢?

为什么不为所有订单使用单个事务(例如将事务置于循环之外)?

如果你愿意接受一个场景,有些订单被保存,有些没有,这是好的,但就像#usr说的,你只需要在提交事务之前SaveChanges一次,你应该记录被拒绝的订单。

多个SaveChanges是必要的,如果你需要得到一个新创建的实体的身份。