用户';s实体DbContext在同时请求时被另一个用户损坏
本文关键字:用户 请求 损坏 另一个 DbContext 实体 | 更新日期: 2023-09-27 18:23:43
我的项目使用Entity Framerwork 6。"n"个类似数据库有1个网站。用户可以从一个数据库切换到另一个数据库。
//-> Unit of Work and repositories
_currentContainer.RegisterType(typeof(ItrsEntities), new PerRequestLifetimeManager(), new InjectionConstructor());
_currentContainer.RegisterType(typeof(ItrsEntitiesWrapper), new InjectionConstructor(_currentContainer));
_currentContainer.RegisterType<IWorkshopRepository, WorkshopRepository>();
_currentContainer.RegisterType<IIndexRepository, IndexRepository>();
当两个用户同时单击时会出现问题。第二个用户从单击的第一个用户"破坏"DbContext
。
表现为:
ObjectContext实例已被释放,不能再用于需要连接的操作。
操作无法完成,因为DbContext已被释放。
- 。。。大量随机误差
问题的另一个奇怪表现:
- 第一个用户获取第二个用户的数据(来自另一个数据库的数据)。这就像第二个用户替换了第一个用户的DbContext
ItrsEntities是DbContext。为了解释什么是我的用户,在我的测试中,我使用了两台不同的计算机和两个不同的Windows帐户。我不是本地人,我已经在服务器上部署了网站。(在当地没问题,因为我一个人)。
我正在使用PerRequestLifetimeManager。我认为这是一个执行问题,但无法找到问题所在。提前感谢,
这听起来像是在应用程序的生命周期中保留上下文,这是一个非常严重的反模式。正如您在代码中看到的那样,它可能会导致各种错误,尤其是当涉及多个线程时。推荐的模式是为每个"逻辑工作单元"创建一个新的上下文,最好用using
块包围。
上下文的构建成本相当低廉,但由于缓存的原因,它们打开和重用的时间越长,就会收集"cruft",这可能会严重降低应用程序的速度。通过缩短上下文的使用寿命,可以最大限度地减少这种影响,并将逻辑操作彼此隔离,从而使调试更加容易。