c# - 基础提供者在打开时失败/该操作对交易状态无效

标签 c# entity-framework entity-framework-6 transactionscope

这是我的代码

public static string UpdateEmptyCaseRevierSet() {
    string response = string.Empty;
    using (System.Transactions.TransactionScope tran = new System.Transactions.TransactionScope()) {
        using (var db = new Entities.WaveEntities()) {
            var maxCaseReviewersSetID = db.CaseReviewerSets.Select(crs => crs.CaseReviewersSetId).Max();
            var emptyCHList = db.CaseHistories.Where(ch => ch.CaseReviewersSetID == null && ch.IsLatest == true && ch.StatusID != 100).ToList();
            for(int i=0; i < emptyCHList.Count; i++) {
                var emptyCH = emptyCHList[i];
                var newCaseReviewerSET = new Entities.CaseReviewerSet();
                newCaseReviewerSET.CreationCHID = emptyCH.CHID;
                db.CaseReviewerSets.Add(newCaseReviewerSET);
                emptyCH.CaseReviewerSet = newCaseReviewerSET;
            }
            db.SaveChanges();
        }
        tran.Complete();
    }
    return response;
}

异常发生在“db.SaveChanges()”

我在另一篇带有相同错误消息的帖子中看到关于 “似乎我无法使用 TransactionScope block 打开到同一数据库的两个连接。” 但我认为这没有任何意义处理我的情况。

此外,插入和更新的记录总数为 2700,女巫真的没有那么多。但是完成 for 语句确实需要相当多的时间(10 分钟左右)。由于 for 语句中发生的一切实际上都发生在内存中,有人可以解释一下为什么要花这么长时间吗?

最佳答案

您可以使用最新的 db.Database.BeginTransaction API 尝试如下所示。

注意:使用foreach代替for

using (var db = new Entities.WaveEntities()) 
  { 
    using (var dbContextTransaction = db.Database.BeginTransaction()) 
       { 
         try 
          { 
            var maxCaseReviewersSetID = db.CaseReviewerSets.Select(crs => crs.CaseReviewersSetId).Max();
            var emptyCHList = db.CaseHistories.Where(ch => ch.CaseReviewersSetID == null && ch.IsLatest == true && ch.StatusID != 100).ToList();

            foreach(var ch in emptyCHList) {
               var newCaseReviewerSET = new Entities.CaseReviewerSet();
               newCaseReviewerSET.CreationCHID = ch.CHID;
               db.CaseReviewerSets.Add(newCaseReviewerSET);
              }

                db.SaveChanges(); 
                dbContextTransaction.Commit(); 
          } 
     catch (Exception) 
        { 
           dbContextTransaction.Rollback(); 
        } 
 } 
} 

关于c# - 基础提供者在打开时失败/该操作对交易状态无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659197/

相关文章:

entity-framework - Entity Framework 代码优先和连接字符串问题

entity-framework - EF 5.0 有 LINQKit 版本吗?否则我还可以为 EF 5.0 使用什么?

c# - .NET 2/3 应用程序拒绝在 .NET 4 下运行

c# - Entity Framework 正在通过 .NetFramework 恢复,而不是我的项目框架 Core V2.0

c# - EntityFramework 更新或插入中文或非英文文本

c# - Entity Framework 以编程方式将模型拆分为多个表

c# - EF6 与 MySQL - 无法添加新行

c# - 为什么 Entity Framework 在 WHERE 子句中添加不必要的 (AND [param] IS NOT NULL)?

c# - 如何将值设置为二维 Excel 范围?

c# - 为什么我必须在 DataGridViewRow 上调用 Cast<> 扩展方法?