异常:ObjectContext实例已被释放,不能再用于需要连接的操作.禁用了LazyLoading



偶尔会出现以下异常:"ObjectContext实例已被释放,不能再用于需要连接的操作"。

这种例外情况的再现是不稳定的,而且很难捕捉到。

通常,当浏览器同时发送两个或多个请求时,我会遇到这种异常。

使用了一个集成测试同时运行数百个线程具有DbContext的唯一实例和模型方法的后续执行。尽管如此,这次测试没有抛出任何异常并通过了测试。

在向Db:发出的第一个请求时引发异常

public IForumCategory GetCategoryById(int id)
{
return Repository.ForumCategories.FirstOrDefault(a => a.Id == id);
}

LazyLoading已被禁用,并且未使用导航属性。"包含"也不使用,而是由"联接"代替。

处理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);
}

根作用域是在Resolver构造函数中初始化的。我可能已经解决了这个问题,但这并不完全是,因为异常是不稳定的。

最新更新