gpt4 book ai didi

asp.net-core - 类型的 DbContext 无法池化,因为它没有接受 DbContextOptions 类型的单个参数的单个公共(public)构造函数

转载 作者:行者123 更新时间:2023-12-01 19:09:09 26 4
gpt4 key购买 nike

我正在尝试将当前的 .Net Core 应用程序从 1.1 升级到 2.0,并收到此运行时错误:“‘CoreContext’类型的 DbContext 无法池化,因为它没有接受单个参数的公共(public)构造函数键入 DbContextOptions"。

这是由于使用新的 IServiceCollection.AddDbContextPool<> 函数引起的。当我使用 IServiceCollection.AddDbContext<> 时它仍然有效。

此应用程序是数据库优先的,因此我使用“Scaffold-DbContext”生成所有上下文。因此,以及注入(inject)其他服务的需要,我在每个上下文上都有一个扩展,如下所示:

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 进行 DI。现在我将默认返回非池化替代方案,但利用此功能会很好。

最佳答案

使用DbContext Pooling时,您在派生的DbContext类中自己的状态(例如私有(private)字段)将被保留。这意味着您的服务的生命周期现在是单例。这就是为什么你不应该在这里注入(inject)其他服务。但可以通过以下方式查询所需的服务:首先,我们应该使用 DbContextOptionsBuilder 上的 UseInternalServiceProvider 方法来告诉 EF 为其服务使用哪个服务提供程序。该服务提供商必须为 EF 和任何提供商配置所有服务。所以我们应该手动注册EF服务:

services.AddEntityFrameworkSqlServer();

然后介绍应用程序的服务提供商,其中现在也包含 EF 服务:

services.AddDbContextPool<ApplicationDbContext>((serviceProvider, optionsBuilder) =>
{
optionsBuilder.UseSqlServer("...");
optionsBuilder.UseInternalServiceProvider(serviceProvider);
});

之后定义这些命名空间:

using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;

现在您可以在应用程序中访问注册的服务ApplicationDbContext类使用以下方法

var siteSettings = this.GetService<IOptionsSnapshot<SiteSettings>>();

或者

var siteSettings = this.GetInfrastructure().GetRequiredService<IOptionsSnapshot<SiteSettings>>();

this 是 DbContext 的当前实例。

关于asp.net-core - 类型的 DbContext 无法池化,因为它没有接受 DbContextOptions 类型的单个参数的单个公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45804470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com