【发布时间】:2018-10-26 04:06:43
【问题描述】:
我正在使用带有 asp.net core 2.1 站点的最新 Hangfire v1.6。我正在使用实体框架核心 2.1
我向 hangfire 提交了一个作业,但我最终遇到了错误,例如我的连接已关闭或已被释放。
...时的异常
2018-10-25 21:35:29.1990|[]|10100|错误|Microsoft.EntityFrameworkCore.Query|An 迭代结果时数据库中发生异常 查询上下文类型 'OmniService.DataAccess.Models.OmniServiceDbContext'。 System.ObjectDisposedException:无法访问已处置的对象。一种 此错误的常见原因是处理已解决的上下文 从依赖注入,然后尝试使用相同的 应用程序中其他地方的上下文实例。如果您可能会发生这种情况 在上下文上调用 Dispose(),或者将上下文包装在 使用语句。如果你使用依赖注入,你应该让 依赖注入容器负责处理上下文 实例。对象名称:'AsyncDisposer'....
我使用的是 Microsoft DI(不是 autofac),看来我可以保持连接打开的唯一方法是将其设置为 Singleton。一旦我这样做了,我就会看到上下文正在跟踪一个已经存在的实例的错误......当然我可以确保不使用跟踪,但这似乎不是解决方案。
即
无法跟踪实体类型“PostedData”的实例,因为 {'SubmitId'} 具有相同键值的另一个实例已经存在 被跟踪。附加现有实体时,确保只有一个 附加了具有给定键值的实体实例。考虑使用 'DbContextOptionsBuilder.EnableSensitiveDataLogging' 查看 键值冲突。
在设置 dbcontext 方面
//hangfire
services.AddHangfire(x => x.UseSqlServerStorage(connectionString));
services.AddDbContext<OmniServiceDbContext>(options =>
options.UseSqlServer(Configuration.GetSection("ConnectionStrings:ConnectionString").Value), ServiceLifetime.Transient);
services.AddTransient(typeof(IPostedDataService), typeof(PostedDataService));
services.AddSingleton<IConfiguration>(Configuration);
那么,我缺少的是为什么hangfire 不喜欢我关于 dbcontext 的瞬态服务?
【问题讨论】:
标签: .net asp.net-core dependency-injection hangfire