当两个并发请求发送到我的ASP.NET MVC Web应用程序时,我收到以下异常。我通过同时从桌面和移动设备登录来模拟这一点。
已经有一个与此命令关联的开放DataReader 必须先关闭。
我使用Autofac注册DbContext
,Repositories
和Services
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请求创建一个唯一的实例。
我注册的唯一单例对象是缓存管理器类。
答案 0 :(得分:1)
在花了10个小时认为与EF有关之后,我决定看看我是如何解决IDbContext
的。
问题是我没有从名为&#39; AutofacWebRequest`的HTTP请求容器中解析IDbContext
。它没有为每个HTTP请求创建实例,因此导致错误。这是与依赖注入相关的问题。
答案 1 :(得分:0)
正如您的评论中所述,即使您设置MultipleActiveDataSets = true
,也请使用InstancePerRequest
。
您正在为DbContext
的每个请求创建一个实例,但SQL服务器接口在多个线程上共享相同的连接以减少资源使用。
此外,EF正在共享延迟加载的资源(另请参阅@ gert-arnold的评论)