异常: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构造函数中初始化的。 我可能已经解决了这个问题,但这不完全是,因为异常不稳定。