偶尔,我得到了以下异常:“该ObjectContext的实例已经设置,不能再用于需要连接的操作”。
此异常的再现不稳定,很难抓到。
一般情况下,我得到这个异常,当两个或两个以上的请求被通过浏览器同时发送。
集成测试使用的DbContext的唯一实例分析和模型方法的后续执行同时运行数百个线程。虽然,本次测试并没有抛出任何异常,并通过。
抛出异常在所述第一请求到DB:
public IForumCategory GetCategoryById(int id)
{
return Repository.ForumCategories.FirstOrDefault(a => a.Id == id);
}
延迟加载已停用,未使用的导航性能。 “包括”也未使用,通过“加入”所取代。
处置的DbContext:
public abstract class WebApiDependencyScope<TModelFactory> : IDependencyScope where TModelFactory : ModelFactory
{
...
public virtual void Dispose()
{
ModelFactory.Dispose();
}
...
}
的DbContext然后通过ModelFactory设置,因此它不能被认为是早期的DbContext设置
更新信息:按ASPNET的WebAPI框架每个请求创建的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);
}
和根范围中初始化解析器构造的。我可能有固定的问题,但是这是不完全的,因为异常是不稳定的。