【发布时间】:2019-02-07 14:44:06
【问题描述】:
有时,我会遇到以下异常: “ObjectContext 实例已被释放,不能再用于需要连接的操作”。
这个异常的重现是不稳定的,很难捕捉到。
通常,当浏览器同时发送两个或多个请求时,我会收到此异常。
使用集成测试同时运行数百个线程 具有唯一的 DbContext 实例和模型方法的后续执行。 不过,这个测试没有抛出任何异常并通过了。
第一次请求 Db 时抛出异常:
public IForumCategory GetCategoryById(int id)
{
return Repository.ForumCategories.FirstOrDefault(a => a.Id == id);
}
LazyLoading 已被禁用,并且未使用导航属性。 “Includes”也没有被使用,而是被“joins”取代。
处理 DbContext:
public abstract class WebApiDependencyScope<TModelFactory> : IDependencyScope where TModelFactory : ModelFactory
{
...
public virtual void Dispose()
{
ModelFactory.Dispose();
}
...
}
DbContext 然后由 ModelFactory 释放,因此它不能被视为早期的 DbContext 释放
更新信息: 由 AspNet WebApi Framework 为每个请求创建的 DbContext:
public override IDependencyScope BeginScope()
{
ISiteRepositoryFactory repositoryFactory = new SiteAspNetRepositoryFactory(Config);
GameModelFactory factory = new GameModelFactory(
repositoryFactory, LocaleProvider, Config, Authenticate);
Scope = new GameWebApiDependencyScope(factory);
return Scope;
}
【问题讨论】:
-
@Mr.Fahrenheit,就是这样。 DbContext 在 DependencyScope 中根据请求创建,然后由 WebApi 处理。
-
您如何确保每个请求都接收到自己的 DbContext 实例?
-
@usr 因为 AspNet WebApi 正在为每个请求创建 DependencyScope,然后 DependencyScope 正在创建 DbContext 的一个实例并将其注入 ModelFactory
-
@usr 我使用 DbContext 实例创建代码将信息添加到主题
标签: c# entity-framework lazy-loading