异常:ObjectContext 实例已被释放,不能再用于需要连接的操作。禁用延迟加载
Exception: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. With disabled LazyLoading
偶尔,我会遇到以下异常:
"The ObjectContext instance has been disposed and can no longer be used for operations that require a connection".
此异常的再现不稳定,很难捕获。
通常,当浏览器同时发送两个或多个请求时,我会遇到此异常。
同时使用了一个集成测试 运行 数百个线程
具有 DbContext 的唯一实例和模型方法的后续执行。
虽然,这个测试没有抛出任何异常并通过了。
第一次请求 Db 时抛出异常:
public IForumCategory GetCategoryById(int id)
{
return Repository.ForumCategories.FirstOrDefault(a => a.Id == id);
}
延迟加载已被禁用,导航属性未被使用。
"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;
}
解决方案
到最后我都看不懂,但也许...
发生了什么:
每次我创建子范围并将其分配给根范围时。但是当请求结束时,每个子范围都在处理。通过这种方式,此时根作用域可以处理作用域,当它尝试从该作用域创建服务时,我遇到了这个异常。
我不知道根作用域是如何以及为什么抛出这个特定异常的。
现在 BeginScope 看起来:
public override IDependencyScope BeginScope()
{
ISiteRepositoryFactory repositoryFactory = new SiteAspNetRepositoryFactory(Config);
GameModelFactory factory = new GameModelFactory(
repositoryFactory, LocaleProvider, Config, Authenticate);
return new GameWebApiDependencyScope(factory);
}
并且Root作用域是在Resolver构造函数中初始化的。
我可能已经解决了这个问题,但这不完全是,因为异常不稳定。
偶尔,我会遇到以下异常: "The ObjectContext instance has been disposed and can no longer be used for operations that require a connection".
此异常的再现不稳定,很难捕获。
通常,当浏览器同时发送两个或多个请求时,我会遇到此异常。
同时使用了一个集成测试 运行 数百个线程 具有 DbContext 的唯一实例和模型方法的后续执行。 虽然,这个测试没有抛出任何异常并通过了。
第一次请求 Db 时抛出异常:
public IForumCategory GetCategoryById(int id)
{
return Repository.ForumCategories.FirstOrDefault(a => a.Id == id);
}
延迟加载已被禁用,导航属性未被使用。 "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;
}
解决方案
到最后我都看不懂,但也许...
发生了什么: 每次我创建子范围并将其分配给根范围时。但是当请求结束时,每个子范围都在处理。通过这种方式,此时根作用域可以处理作用域,当它尝试从该作用域创建服务时,我遇到了这个异常。
我不知道根作用域是如何以及为什么抛出这个特定异常的。
现在 BeginScope 看起来:
public override IDependencyScope BeginScope()
{
ISiteRepositoryFactory repositoryFactory = new SiteAspNetRepositoryFactory(Config);
GameModelFactory factory = new GameModelFactory(
repositoryFactory, LocaleProvider, Config, Authenticate);
return new GameWebApiDependencyScope(factory);
}
并且Root作用域是在Resolver构造函数中初始化的。 我可能已经解决了这个问题,但这不完全是,因为异常不稳定。