当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 23:46:29 C#

C#学习教程:Entityframeworknewtransactionisnotallowedbecauseotherthreadsarerunninginsession,multithreadingsaveshare,但是我得到如下错误:Newtransactionisnotallowedbecausethereareotherthreadsrunninginthesession.在每个胎面我都有这个功能:Context.SPC_SENDING_TRACE.AddObject(trace);如果(Context.SaveChanges(result)==false)返回false;返回真;每个线程的Context是不同的,但是到DB的连接总是一样的。有没有解决的办法?谢谢Andrea你应该为每个事务创建一个上下文然后处理它,你可以这样做:using(varctx=newMyContext()){//dotransactionhere}在右括号之后,处理上下文。为了更好地理解,请参阅这篇文章,您可以通过ken2k找到一个很好的答案。希望您能解决您的问题:)更新:您还应该尝试将.ToList()添加到您拥有的每个LINQ查询中。迭代LINQ结果时,在迭代完成之前不能进行任何更改。检查您是否有类似的东西或共享更多代码,即您调用WriteTrace的代码WriteTrace。希望这一次真的能帮到你。我在多线程环境中使用实体框架,其中任何线程、ui和后台(STA和MTA)都可以同时更新同一个数据库。我通过在任何新的后台线程开始使用时从头开始重新创建实体连接来解决这个问题。检查实体连接实例ConnectionString会显示一个阅读器guid,我假设它用于链接公共连接实例。通过从头开始重新创建实体连接,每个线程的guid值都不同,不会发生冲突。以上是C#学习教程:实体框架的newtransactions是不允许的,因为session中有其他线程在运行,多线程保存了所有的共享内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—//构建连接字符串。varsqlBuilder=newSqlConnectionStringBuilder();sqlBuilder.DataSource=服务器名称;sqlBuilder.InitialCatalog=数据库名称;sqlBuilder.MultipleActiveResultSets=true;...varproviderString=sqlBuilder.ToString();varsqlConnection=newSqlConnection(providerString);//建立实体连接。程序集元数据Assembly=Assembly.获取执行程序集();程序集[]metadataAssemblies={metadataAssembly};varmetadataBase=@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl";vardbModelMetadata=String.Format(metadataBase,objectContextTypeModelName);//例如:“res://*/Models.MyDatabaseModel.csdl|res://*/Models.MyDatabaseModel.ssdl|res://*/Models.MyDatabaseModel.msl”varmodelMetadataPaths=modelMetadata.Split('|');varmetadataWorkspace=newMetadataWorkspace(模型元数据路径,元数据组件);varentityDbConnection=newEntityConnection(metadataWorkspace,sqlConnection);返回entityDbConnection;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。