我正在使用EF Core作为数据库访问构建API,目前在dotnet 6 RC1上进行。我想使用dotnet cli工具来管理迁移(创建、更新数据库等),但是这些工具与模板中的minimal API不兼容。
以下是我的Program.cs文件:
如果那段代码使用了Program/Startup类组合和旧的构建器,我可以在控制台中输入
作为解决方法,我创建了一个设计时上下文工厂。
以下是我的Program.cs文件:
void ConfigureApp(WebApplication webApplication)
{
// Configure the HTTP request pipeline.
if (webApplication.Environment.IsDevelopment())
{
webApplication.UseSwagger();
webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Eyespert.Server v1"));
}
webApplication.UseHttpsRedirection();
webApplication.UseAuthentication();
webApplication.UseAuthorization();
webApplication.MapControllers();
}
void RegisterServices(WebApplicationBuilder builder)
{
builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new() { Title = "App", Version = "v1" });
});
builder.Services.AddDbContext<MyContext>(opt =>
{
string connectionString = builder.Configuration.GetConnectionString("MyConnectionString");
opt.UseNpgsql(connectionString);
});
}
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
RegisterServices(builder);
WebApplication app = builder.Build();
ConfigureApp(app);
app.Run();
如果那段代码使用了Program/Startup类组合和旧的构建器,我可以在控制台中输入
dotnet ef migrations add InitialCreate
,该工具会读取appsettings.development.json(即使它与上下文不同),并在正确的数据库上运行迁移。但是,在最小API样式中,情况并非如此。作为解决方法,我创建了一个设计时上下文工厂。
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyContext>
{
public MyContextCreateDbContext(string[] args)
{
DbContextOptionsBuilder<MyContext> dbContextOptionsBuilder =
new();
dbContextOptionsBuilder.UseNpgsql(@"myconnectionstring");
Console.WriteLine("Creating default MyContext");
return new MyContext(dbContextOptionsBuilder.Options);
}
}
您可以看到,我硬编码了连接字符串。我知道可以构造ConfigurationBuilder
并使用相对路径来找到正确的json文件,并使用它来查找连接字符串,但这感觉像是一个肮脏的hack。
在dotnet 6中,最好的方法是什么?