更新实体框架模型时发生事务错误
在尝试连接来自两个单独数据库的实体时,开发人员可能会遇到错误:“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中文网其他相关文章!