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