.NET 6如何在program.cs中自动运行迁移

2024-01-04

在.Net 5中,我们可以通过将DataContext传递给Configure方法来调用迁移,并在启动类中调用迁移。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DataContext dataContext)
{
    // migrate any database changes on startup (includes initial db creation)
    dataContext.Database.Migrate();

    ...
}

我们如何在.Net 6 中做到这一点?


简洁版本

听起来真正的问题是将过去的代码放在哪里Startup.Configure.

In Program.cs use

using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<SomeDbContext>();
    db.Database.Migrate();
}

解释比较长

The 在运行时应用迁移 https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/applying?tabs=vs#apply-migrations-at-runtimeEF Core 迁移文档中的部分显示,就 EF Core 而言,没有任何变化。

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<SomeDbContext>();
        //Same as the question
        db.Database.Migrate();
    }

    host.Run();
}

听起来真正的问题是将过去的代码放在哪里Startup.Configure。该代码可以放在Main方法,或者,如果使用最小 API,则在内部Program.cs. Configuration, Services, Environment等可用作属性网络应用程序生成器 https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.webapplicationbuilder?view=aspnetcore-6.0类或Web应用程序 https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.webapplication?view=aspnetcore-6.0由它创造的。WebApplicationBuilder包含 DI、配置、日志记录和主机的构建器接口,例如WebApplicationBuilder.Services暴露IServiceCollection.

WebApplication属性公开了配置的中间件WebApplicationBuilder, eg WebApplication.Services暴露IServiceProvider

最小 API 中的启动替换

中的方法Startup.cs被合并在Program.cs在.NET 6中,Startup.cs包含两种方法:

  • 配置主机和应用程序的方法,例如设置配置和 DI,通过调用各种构建器接口,例如IServiceCollection, IConfigurationBuilder。这包括以前的代码Startup.ConfigureServices.
  • 使用主机配置端点、使用服务和中间件的方法。这包括位于Startup.Configure.

在 .NET 6 中,接口移至 WebApplicationBuilder 和 WebApplication 类。 .NET Core 不是调用“神奇”的 Startup 类并注入接口,而是使用以下代码Program.cs可以直接访问它需要的接口。

  • 主机构建/配置服务现在可通过网络应用程序生成器 https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.webapplicationbuilder?view=aspnetcore-6.0 class.
  • 完整应用程序主机提供的接口现在可通过Web应用程序 https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.builder.webapplication?view=aspnetcore-6.0由 WebApplicationBuilder 构建的类。

If you don't需要配置服务,您只需 3 行即可创建一个最小的 API 应用程序:

var app = WebApplication.Create(args);

app.MapGet("/", () => "Hello World!");

app.Run();

在您的情况下,您至少需要配置 DbContext,因此您需要使用WebApplicationBuilder and WebApplication分别地。这将在下一节中显示

最小 API 中的迁移

在基本的最小 API 中Program.cs :

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

DbContexts 可以创建一次WebApplication实例是通过其创建的Services财产:

var builder = WebApplication.CreateBuilder(args);
//Register the DbContexts etc.
...
builder.Services.AddDbContext<SomeDbContext>(....);

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<SomeDbContext>();
    db.Database.Migrate();
}

app.MapGet("/", () => "Hello World!");

app.Run();

当然这是一个lot最好对此类代码使用单独的方法或类,保持Program.cs clean :

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<SomeDbContext>(....);
var app = builder.Build();

ApplyMigrations(app);

app.MapGet("/", () => "Hello World!");

app.Run();

static void ApplyMigrations(WebApplication app)
{
    using var scope = app.Services.CreateScope();
    var db = scope.ServiceProvider.GetRequiredService<SomeDbContext>();
    db.Database.Migrate();
}

甚至 :

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<SomeDbContext>(....);
var app = builder.Build();

app.ApplyMigrations()
   .UseCustomLogging()
   .DoSomeOtherConfiguration()
   ...;

app.MapGet("/", () => "Hello World!");

app.Run();

With ApplyMigrations单独类中的扩展方法:

public static DataExtensions
{
    public static WebApplication ApplyMigrations(this WebApplication app)
    {
        using var scope = app.Services.CreateScope()
        var db = scope.ServiceProvider.GetRequiredService<SomeDbContext>();
        db.Database.Migrate();
        return app;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 6如何在program.cs中自动运行迁移 的相关文章

随机推荐