我正在尝试将我们当前的 .Net Core 应用程序从 1.1 升级到 2.0,但是遇到了这个运行时错误:"类型为 'CoreContext' 的 DbContext 无法被池化,因为它没有单一公共构造函数接受一个类型为 DbContextOptions 的参数。"
这是由于使用了新的 IServiceCollection.AddDbContextPool<> 函数导致的。当我使用 IServiceCollection.AddDbContext<> 时仍然可以工作。
这个应用程序是基于数据库的,所以我使用'Scaffold-DbContext'生成所有的上下文。由于这个原因和需要注入其他服务,我有一个每个上下文都有的扩展,像这样:
public partial class CoreContext
{
public CoreContext(
DbContextOptions<CoreContext> options,
IUserService userService,
IAuditRepository auditRepository
) : base(options) {...}
}
无论何时我运行Scaffold-DbContext,我都会从CoreContext中删除自动生成的构造函数,但即使我将其放在那里,我仍然会收到此错误。public partial class CoreContext : DbContext
{
public CoreContext(DbContextOptions<CoreContext> options) : base(options) {}
}
我已经将 Program.cs 更新为新的风格:
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
}
而Startup.cs非常简单:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
...
services.AddDbContextPool<CoreContext>(options => options.UseSqlServer(absConnectionString));
...
}
我正在使用Autofac进行依赖注入,如果有帮助的话。目前我将默认回退到非池化的替代方案,但是利用这个功能会很好。