不允许entity framework新事务,因为在会话中运行其他线程,multithreading保存

我试着在DB上保存multithreadingprocesso的日志,但是我收到以下错误:不允许新事务,因为会话中还有其他线程在运行。

在每个胎面我都有这个function:

internal bool WriteTrace(IResult result, string message, byte type) { SPC_SENDING_TRACE trace = new SPC_SENDING_TRACE( message, Parent.currentLine.CD_LINE, type, Parent.currentUser.FULLNAME, Parent.guid); Context.SPC_SENDING_TRACE.AddObject(trace); if (Context.SaveChanges(result) == false) return false; return true; } 

每个线程的Context都不同,但与DB的连接始终是相同的。

有没有办法解决这个问题?

谢谢Andrea

你应该为每个事务创建一个上下文然后处理它,你可以这样做:

 using(var ctx = new MyContext()) { //do transaction here } 

在关闭的括号之后,处理上下文。

为了更好地理解,请参阅这篇文章 ,您可以通过ken2k找到一个很好的答案。 希望你能解决你的问题:)

更新:

您还应该尝试将.ToList()添加到您拥有的每个LINQ查询中。 迭代LINQ结果时,在迭代完成之前不能进行任何更改。 检查您是否有类似的东西或共享更多代码,即您调用WriteTrace的代码WriteTrace 。 希望这次这实际上对你有所帮助。

我在multithreading环境中使用entity framework,其中任何线程,ui和后台(STA和MTA)都可以同时更新同一个数据库。 我通过在任何新的后台线程的使用开始时从头开始重新创建实体连接来解决这个问题。 检查实体连接实例ConnectionString显示了一个读者guid,我假设它用于链接常见的连接实例。 通过从头开始重新创建实体连接,每个线程的guid值都不同,并且不会发生冲突。

 // Build the connection string. var sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.DataSource = serverName; sqlBuilder.InitialCatalog = databaseName; sqlBuilder.MultipleActiveResultSets = true; ... var providerString = sqlBuilder.ToString(); var sqlConnection = new SqlConnection(providerString); // Build the emtity connection. Assembly metadataAssembly = Assembly.GetExecutingAssembly(); Assembly[] metadataAssemblies = { metadataAssembly }; var metadataBase = @"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl"; var dbModelMetadata = String.Format(metadataBase, objectContextTypeModelName); // eg: "res://*/Models.MyDatabaseModel.csdl|res://*/Models.MyDatabaseModel.ssdl|res://*/Models.MyDatabaseModel.msl" var modelMetadataPaths = modelMetadata.Split('|'); var metadataWorkspace = new MetadataWorkspace(modelMetadataPaths, metadataAssemblies); var entityDbConnection = new EntityConnection(metadataWorkspace, sqlConnection); return entityDbConnection;