Entity framework 多个HTTP请求共享相同的DbContext

Entity framework 多个HTTP请求共享相同的DbContext,entity-framework,dependency-injection,autofac,dbcontext,Entity Framework,Dependency Injection,Autofac,Dbcontext,当两个并发请求被发送到我的ASP.NET MVC web应用程序时,我收到以下异常。我通过同时从桌面和手机登录来模拟这种情况 已存在与此命令关联的打开的DataReader,该命令 必须先关闭 我正在使用Autofac注册DbContext,存储库和服务 builder.RegisterType<DbContext>().As<IDbContext>().Named<IDbContext>("appdb").InstancePerRequest(); buil

当两个并发请求被发送到我的ASP.NET MVC web应用程序时,我收到以下异常。我通过同时从桌面和手机登录来模拟这种情况

已存在与此命令关联的打开的DataReader,该命令 必须先关闭

我正在使用Autofac注册
DbContext
存储库
服务

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();
builder.RegisterType().As().Named(“appdb”).InstancePerRequest();
builder.RegisterType().As().Named(“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();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
我的理解是,我之所以收到错误,是因为相同的
DbContext
实例正在请求之间共享(根范围)

这没有意义,因为我已经注册了
DbContext
实例,为每个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();

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

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

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


此外,EF正在为延迟加载共享资源(另请参见@gert arnold的评论)

在花了10个小时思考它与EF相关后,我决定看看我是如何解决
IDbContext


问题是我没有从名为“AutofacWebRequest”的HTTP请求容器解析
IDbContext
。它没有为每个HTTP请求创建一个实例,因此导致了错误。这是一个与依赖项注入相关的问题。

这可能是因为我将我的
DbContext
命名为“appdb”,并且每个请求都收到了相同的实例吗?Edit=没有任何影响。请提供您的连接字符串好吗?@StephenReindl
我已经研究过多个活动数据集,将其设置为true将解决此问题。但是,我仍然不明白为什么在DbContext注册为
InstancePerRequest
时会收到错误。常见原因是EF正在具体化实体列表,并且在该过程中会触发延迟加载。在单线程环境中也会发生这种情况。