在服务提供程序上调用了“AddEntityFramework*”,但在DbContext选项配置中没有调用“UseInternalServiceProvider”。

24

我正在将一个ASP.NET Core应用程序从2.2框架升级到3.1。它还使用Entity Framework Core。

在Startup.ConfigureServices方法中,有这段代码:

services.AddEntityFrameworkNpgsql()
    .AddDbContext<MainDbContext>(options => options
        .UseNpgsql(Configuration.GetConnectionString("MainDbContext")));

.NET Core 2.2时一切正常,但在.NET Core 3.1中,每次应用程序启动时都会收到此警告:

在服务提供程序上调用了 'AddEntityFramework*',但在 DbContext 选项配置中没有调用 'UseInternalServiceProvider'。在大多数情况下,删除 'AddEntityFramework*' 调用是不需要的,且可能会与注册在同一服务提供程序中的其他产品和服务发生冲突。

查找 UseInternalServiceProvider 方法,看起来应该在 options 上调用它以传递主服务提供程序。不幸的是,在这一点上,服务提供程序尚不存在。它即将被构建。

我不理解问题所在和这个警告想要告诉我的内容,但却失败了。如何让这个警告消失呢?网络上还不知道这个消息。


通常情况下没有理由调用AddEntityFrameworkWhatever,这是.UseSqlServer.UseNpgsql的工作。你确定需要这个调用吗? - Panagiotis Kanavos
1个回答

41

移除 AddEntityFrameworkNpgsql。文档解释

对于构建大多数应用程序,包括在 ASP.NET 或其他地方使用依赖注入的应用程序,不再需要调用此方法。仅在构建内部服务提供程序以与该方法一起使用时才需要它。这不推荐除了某些高级方案之外。

Npgsql 的入门指南页面显示无需额外设置:

只需在 Startup.cs 中的 ConfigureServices 方法中放置以下内容:

public void ConfigureServices(IServiceCollection services)
{
    // Other DI initializations

    services.AddDbContext<BloggingContext>(options =>
            options.UseNpgsql(Configuration.GetConnectionString("BloggingContext")));
}

如果我这样做,应用程序的其他部分将无法解析MainDbContext,从而导致问题。此外,如果没有相关代码,任何人怎么知道应该使用Postgres数据库呢? - ygoe
代码是存在的,我已经发布了链接到文档。AddDbContext用于向DI容器注册DbContext,这意味着你不应该会遇到任何DI错误。你是如何以及在哪里遇到的异常?完整的异常信息是什么?应用程序中的其他部分如何使用DI?它们可能使用了不同的ServiceProvider吗? - Panagiotis Kanavos
抱歉,我误读了缩进并且还删除了 AddDbContext 调用。当仅删除 AddEntityFrameworkNpgsql 调用并保留其余部分时,它可以工作。谢谢! - ygoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接