Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与当前连接关联的事务已完成,但尚未处理_C#_Sql_Multithreading_Entity Framework_Linq - Fatal编程技术网

C# 与当前连接关联的事务已完成,但尚未处理

C# 与当前连接关联的事务已完成,但尚未处理,c#,sql,multithreading,entity-framework,linq,C#,Sql,Multithreading,Entity Framework,Linq,我在跟踪代码 当我运行此代码时收到此错误消息,我无法判断我做错了什么,因为我完全是从页面复制的。你知道我做错了什么吗 错误消息:与当前连接关联的事务已完成,但尚未处理。必须先释放事务,然后才能使用连接执行SQL语句 代码似乎在一段时间内运行良好,但随后它几乎会在我在下面标记的行的同一时间停止。我不知道发生了什么事 堆栈跟踪: 位于System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()处 位于System.

我在跟踪代码

当我运行此代码时收到此错误消息,我无法判断我做错了什么,因为我完全是从页面复制的。你知道我做错了什么吗

错误消息:与当前连接关联的事务已完成,但尚未处理。必须先释放事务,然后才能使用连接执行SQL语句

代码似乎在一段时间内运行良好,但随后它几乎会在我在下面标记的行的同一时间停止。我不知道发生了什么事

堆栈跟踪:

位于System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()处 位于System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.b__2(UpdateTranslator ut) 位于System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult,Func`2 updateFunction) 位于System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()处 位于System.Data.Entity.Core.Objects.ObjectContext.b__35() 在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 Func,IDBEcutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess) 位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项、IDBEcutionStrategy executionStrategy、Boolean startLocalTransaction) 在System.Data.Entity.Core.Objects.ObjectContext.c__DisplayClass2a.b__27()中 在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1操作)中 位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions选项,布尔值executeInExistingTransaction) 位于System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions) 位于System.Data.Entity.Internal.InternalContext.SaveChanges()处

公共静态异步任务StartInitialMarketSymbols下载(字符串市场)
{
尝试
{
列表符号列表=新列表();
符号列表=getStockSymbols(市场);
var historicalGroups=symbolList.Select((x,i)=>new{x,i})
.GroupBy(x=>x.i/50)
.Select(g=>g.Select(x=>x.x).ToArray());
List[]amexListArray=wait Task.WhenAll(历史组。选择(g=>Task.Run(()=>getLocalHistoricalStockData(g,market)));
使用(TransactionScope范围=新TransactionScope())
{
ooplesfinanceEntities上下文=null;
列表amexList=null;
尝试
{
amexList=新列表();
foreach(在amexListArray中列出singleList)
{
amexList.AddRange(singleList);
}
上下文=新金融实体();
context.Configuration.AutoDetectChangesEnabled=false;
整数计数=0;
foreach(amexList中的var amexData)
{
++计数;
context=AddToContext(context,amexData,count,100,true);
}
SaveChanges();
控制台。WriteLine(“一切都结束了!”);
}
最后
{
if(上下文!=null)
context.Dispose();
}
scope.Complete();
}
}
捕获(例外情况除外)
{
Console.WriteLine(例如InnerException.Message);
}
}
私有静态financeEntities AddToContext(financeEntities上下文、DailyAmexData实体、int计数、int提交计数、bool重新创建上下文)
{
context.Set().Add(实体);
如果(计数%commitCount==0)
{
context.SaveChanges();**//似乎发生在这一行**
Console.WriteLine(“保存100项”);
如果(重新创建上下文)
{
context.Dispose();
上下文=新金融实体();
context.Configuration.AutoDetectChangesEnabled=false;
}
}
返回上下文;
}

如果需要插入一百万行,则应使用批量插入。我编写了一个通用的批量插入类,并将代码发布在这里

我希望有帮助


Juan

请发布完整的异常堆栈。您引用的答案可以追溯到6年前。我相信从那时起,情况发生了很大变化。你到底想干什么?按照您设置代码的方式,您正在事务中包装一个事务。@Juan我有超过一百万行要插入到数据库中,所以我试图找到一种快速完成它的方法。我还发布了完整的异常堆栈,正如您现在意识到的,EF并不是为批量操作而构建的。您是否关心数据是否以块的形式提交?或者你需要同时提交一百万条记录吗?@Juan我不在乎它是否是成批提交的,只要它完成得很快。你使用了那个代码吗?C#中的通用批量插入助手有用吗?还是仅仅是批量插入概念?
public static async Task startInitialMarketSymbolsDownload(string market)
        {
            try
            {
                List<string> symbolList = new List<string>();
                symbolList = getStockSymbols(market);

                var historicalGroups = symbolList.Select((x, i) => new { x, i })
                          .GroupBy(x => x.i / 50)
                          .Select(g => g.Select(x => x.x).ToArray());

                List<DailyAmexData>[] amexListArray = await Task.WhenAll(historicalGroups.Select(g => Task.Run(() => getLocalHistoricalStockData(g, market))));


                using (TransactionScope scope = new TransactionScope())
                {
                    ooplesfinanceEntities context = null;
                    List<DailyAmexData> amexList = null;

                    try
                    {
                        amexList = new List<DailyAmexData>();

                        foreach (List<DailyAmexData> singleList in amexListArray)
                        {
                            amexList.AddRange(singleList);
                        }

                        context = new financeEntities();
                        context.Configuration.AutoDetectChangesEnabled = false;

                        int count = 0;
                        foreach (var amexData in amexList)
                        {
                            ++count;
                            context = AddToContext(context, amexData, count, 100, true);
                        }

                        context.SaveChanges();
                        Console.WriteLine("Everything is finished!");
                    }
                    finally
                    {
                        if (context != null)
                            context.Dispose();
                    }

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.InnerException.Message);
            }
        }

        private static financeEntities AddToContext(financeEntities context, DailyAmexData entity, int count, int commitCount, bool recreateContext)
        {
            context.Set<DailyAmexData>().Add(entity);

            if (count % commitCount == 0)
            {
                context.SaveChanges(); **// seems to happen at this line**
                Console.WriteLine("100 items saved");
                if (recreateContext)
                {
                    context.Dispose();
                    context = new financeEntities();
                    context.Configuration.AutoDetectChangesEnabled = false;
                }
            }

            return context;
        }