【问题标题】:IHost extension in .Net6.Net6 中的 IHost 扩展
【发布时间】:2022-12-29 20:58:51
【问题描述】:

我正在尝试将用于 EF 种子迁移的 IHost 扩展从 .Net5 迁移到 .Net6。能否请您指导我进行此转换的正确方法。

 public static class HostExtensions
    {
        public static IHost MigrateDatabase<TContext>(this IHost host,
                                            Action<TContext, IServiceProvider> seeder,
                                            int? retry = 0) where TContext : DbContext
        {
            int retryForAvailability = retry.Value;

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                <code removed for brevity>                 
            }
            return host;
        }
    }

在 .Net5 中调用扩展如下:

  public static void Main(string[] args)
        {
            CreateHostBuilder(args)
                .Build()
                .MigrateDatabase<OrderContext>((context, services) =>
                {
                    var logger = services.GetService<ILogger<OrderContextSeed>>();
                    OrderContextSeed
                        .SeedAsync(context, logger)
                        .Wait();
                })
                .Run();
        }

【问题讨论】:

  • 你的问题是?

标签: .net entity-framework entity-framework-core .net-5 .net-6.0


【解决方案1】:

迁移数据库:

public static IHost MigrateDatabase(this IHost host)
    {
        using var scope = host.Services.CreateScope();

        var sp = scope.ServiceProvider;
        var loggerFactory = sp.GetRequiredService<ILoggerFactory>();

        // operations 
       
        return host;
    }

程序.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Host
    .Build()
    .MigrateDatabase();

var app = builder.Build();

apo.Run();

【讨论】:

  • ⚠️注意:将代码放在这里会导致它在运行dotnet ef时执行。在实现 dotnet/efcore#27306 之前,您可能希望坚持使用 Program.Main/CreateHostBuilder 方法。
  • “ConfigureHostBuilder”不包含“Build”的定义,并且找不到接受“ConfigureHostBuilder”类型的第一个参数的可访问扩展方法“Build”(是否缺少 using 指令或程序集引用?)出现上述错误。无法找到 Build 方法。
  • 反编译 Host 对象显示了这个 Build() 方法:不确定你是如何调用 Build 方法的。
【解决方案2】:

在 Program.cs 中这样使用 :)

var app = builder.Build();
 app.MigrateDatabase<WebSocketAcceptContext>();

【讨论】:

    猜你喜欢
    • 2020-09-10
    • 2021-07-22
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2017-03-28
    相关资源
    最近更新 更多