简洁版本
听起来真正的问题是将过去的代码放在哪里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;
}
}