我现在使用这个代码:
public static class DataHelper
{
public static async Task ManageDataAsync(IServiceProvider svcProvider)
{
var dbContextSvc = svcProvider.GetRequiredService<AppDbContext>();
await dbContextSvc.Database.MigrateAsync();
}
}
我打电话:
await DataHelper.ManageDataAsync(scope.ServiceProvider);
在
Program.cs
班。
问题是,当我第一次运行该应用程序时,如果数据库尚未更新,它会完美运行,但是当我在数据库更新后第二次运行它时,它会崩溃并说数据库已更新已经更新了。
如何才能有一个 if 语句,仅在数据库尚未更新时才更新数据库,并在已更新时忽略此调用?
GetPendingMigrations\[Async\]
检查是否有任何待处理的迁移,如果没有则跳过 Migrate[Async]
:
public static class DataHelper
{
public static async Task ManageDataAsync( IServiceProvider sp, CancellationToken cancellationToken = default )
{
if( sp is null ) throw new ArgumentNullException( nameof(sp) );
//
using AppDbContext db = sp.GetRequiredService<AppDbContext>();
// https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.getpendingmigrationsasync
IEnumerable<String> pendingMigrationIds = await context.Database.GetPendingMigrationsAsync( cancellationToken ).ConfigureAwait(false);
if( pendingMigrationIds.Any() )
{
await db.Database.MigrateAsync();
}
}
}