【问题标题】:How to use UseLoggerFactory in conjunction with UseInternalServiceProvider如何将 UseLoggerFactory 与 UseInternalServiceProvider 结合使用
【发布时间】:2023-03-08 10:00:01
【问题描述】:

我们有一个 asp.net 核心 Web API 并像这样注册我们的 EF DB 上下文

services
            .AddDbContext<SiteDbContext>((serviceProvider, opt) =>
            {
                opt
                    .UseNpgsql(options.Site)
                    .UseInternalServiceProvider(serviceProvider)
                    ;
            })

数据库上下文调用 DbContextOptionsBuilder.UseLoggerFactory 失败。 看着这个文档https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontextoptionsbuilder.useloggerfactory?view=efcore-5.0 上面提到你不能做我刚才做的,建议“在这种情况下,ILoggerFactory应该直接在那个服务提供者中配置。”

我的问题是具体是怎么做的?直接在该服务提供者中进行配置。

【问题讨论】:

  • 为什么要更换内部服务商? EF Core 将其用于自己的内部服务

标签: entity-framework-core asp.net-core-webapi


【解决方案1】:

来自the docs(强调我的):

设置上下文应该解析其所有服务的IServiceProvider。如果未指定,EF 将创建和管理服务提供者。

服务提供者必须包含实体框架(以及所使用的数据库)所需的所有服务。可以使用IServiceCollection 上的扩展方法注册实体框架服务。例如,Microsoft SQL Server 提供程序包括一个 AddEntityFrameworkSqlServer() 方法来添加所需的服务。

除非您注册了 EF 核心需要的每一个内部服务,否则不应尝试将内部服务提供者替换为应用级服务提供者。

如果您确实需要设置记录器工厂,有一种更简单的配置方法。使用给你一个IServiceProvider的重载:

services.AddDbContext<AppDbContext>((provider, options) =>
{
    var loggerFactory = provider.GetRequiredService<ILoggerFactory>();
    options
        .UseNpgsql(/* ... */)
        .UseLoggerFactory(loggerFactory);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2012-04-01
    • 2017-06-13
    • 2019-02-09
    • 2012-08-21
    • 2018-02-23
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多