为多个HTTP请求共享相同的DbContext

时间:2016-01-18 21:48:03

标签: entity-framework dependency-injection autofac dbcontext

当两个并发请求发送到我的ASP.NET MVC Web应用程序时,我收到以下异常。我通过同时从桌面和移动设备登录来模拟这一点。

  

已经有一个与此命令关联的开放DataReader   必须先关闭。

我使用Autofac注册DbContextRepositoriesServices

builder.RegisterType<DbContext>().As<IDbContext>().Named<IDbContext>("appdb").InstancePerRequest();
builder.RegisterType<LogDbContext>().As<IDbContext>().Named<IDbContext>("applogdb").InstancePerRequest();
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerRequest();

还为每个唯一的HTTP请求注册了服务。

builder.RegisterType<ProductService>().As<IProductService>().InstancePerRequest();
builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerRequest();
builder.RegisterType<ProductLineService>().As<IProductLineService>().InstancePerRequest();
builder.RegisterType<PatientService>().As<IPatientService>().InstancePerRequest();
builder.RegisterType<CommonService>().As<ICommonService>().InstancePerRequest();

我的理解是我收到错误,因为请求(根范围)之间共享相同的DbContext实例。

这没有意义,因为我已经注册了我的DbContext实例,为每个HTTP请求创建一个唯一的实例。

我注册的唯一单例对象是缓存管理器类。

2 个答案:

答案 0 :(得分:1)

在花了10个小时认为与EF有关之后,我决定看看我是如何解决IDbContext的。

问题是我没有从名为&#39; AutofacWebRequest`的HTTP请求容器中解析IDbContext。它没有为每个HTTP请求创建实例,因此导致错误。这是与依赖注入相关的问题。

答案 1 :(得分:0)

正如您的评论中所述,即使您设置MultipleActiveDataSets = true,也请使用InstancePerRequest

您正在为DbContext的每个请求创建一个实例,但SQL服务器接口在多个线程上共享相同的连接以减少资源使用。

此外,EF正在共享延迟加载的资源(另请参阅@ ge​​rt-arnold的评论)