【问题标题】:Exception: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. With disabled LazyLoading异常:ObjectContext 实例已被释放,不能再用于需要连接的操作。禁用 LazyLoading
【发布时间】: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


【解决方案1】:

解决方案

直到最后我都无法理解,但也许……

发生了什么: 每次我创建子范围并将其分配给根范围时。但是每个子范围都在请求结束时进行处理。通过这种方式,此时根范围可以已处置范围,当它尝试从该范围创建服务时,我有这个异常。

我不知道根范围如何以及为什么会抛出这个特定的异常。

现在 BeginScope 看起来:

public override IDependencyScope BeginScope()       
{           
    ISiteRepositoryFactory repositoryFactory = new SiteAspNetRepositoryFactory(Config);
    GameModelFactory factory = new GameModelFactory(
     repositoryFactory, LocaleProvider, Config, Authenticate);

    return new GameWebApiDependencyScope(factory);
}

并且 Root 范围是在 Resolver 构造函数中初始化的。 我可能已经解决了这个问题,但这并不完全正确,因为异常是不稳定的。

【讨论】:

    猜你喜欢
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多