首页 > 后端开发 > C++ > 为什么我的实体框架代码抛出'不允许新事务,因为会话中还有其他线程正在运行”?

为什么我的实体框架代码抛出'不允许新事务,因为会话中还有其他线程正在运行”?

Linda Hamilton
发布: 2025-01-16 13:36:59
原创
311 人浏览过

Why Does My Entity Framework Code Throw

更新实体框架模型时发生事务错误

在尝试连接来自两个单独数据库的实体时,开发人员可能会遇到错误:“New不允许事务,因为会话中还有其他线程正在运行。”当尝试合并多个循环和实体框架上下文的代码时,可能会出现此令人困惑的消息。

根本问题源于实体框架 (EF) 为创建的每个上下文维护一个会话。当多个线程同时访问同一上下文时,可能会导致事务冲突。要解决此问题,避免在不同线程中修改相同的上下文至关重要。

在提供的示例中,错误的根本原因是在 EF 查询上使用嵌套的 foreach 循环。这种方法意味着为外循环的每次迭代创建一个新的 EF 上下文,从而导致大量活动会话同时访问同一上下文。

最佳解决方案是使用查询从 EF 检索数据并将其存储在中间集合中(例如,IList)。这允许处理上下文并为每次后续迭代创建新的上下文,而不会引发事务冲突。

下面是修改后的代码示例来说明:

IList<Client> clientList = from a in _dbFeed.Client.Include("Auto") select a;
foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
{
   var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a;
    // ...
}
登录后复制

通过隔离从上下文中检索数据,我们消除了重叠交易的风险并确保不会遇到错误。

以上是为什么我的实体框架代码抛出'不允许新事务,因为会话中还有其他线程正在运行”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板