-
Notifications
You must be signed in to change notification settings - Fork 0
/
DatabaseService.cs
77 lines (59 loc) · 2.68 KB
/
DatabaseService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
namespace ExampleWebApp.Backend.WebApi;
public static partial class Extensions
{
/// <summary>
/// Configure db connection string and provider.
/// </summary>
public static void ConfigureDatabase(this WebApplicationBuilder webApplicationBuilder)
{
var isUnitTest = webApplicationBuilder.Configuration.GetConfigVar<bool>(CONFIG_KEY_IsUnitTest);
var connString = isUnitTest ?
webApplicationBuilder.Configuration.GetConfigVar(CONFIG_KEY_UnitTestConnectionString) :
webApplicationBuilder.Configuration.GetConfigVar(CONFIG_KEY_ConnectionString);
var provider = webApplicationBuilder.Configuration.GetConfigVar<ConfigValuesDbProvider>(CONFIG_KEY_DbProvider);
//
// normal config for db providers
//
webApplicationBuilder.Services.AddDbContext<AppDbContext>(options =>
{
switch (provider)
{
case ConfigValuesDbProvider.Postgres:
{
options.UseNpgsql(connString, x => x.MigrationsAssembly("AppDbMigrationsPsql"));
}
break;
default: throw new NotImplementedException($"provider {provider} not implemented");
}
options
.EnableSensitiveDataLogging();
});
}
/// <summary>
/// Auto apply database pending migrations.
/// </summary>
public static async Task ApplyDatabaseMigrations(this WebApplication app,
CancellationToken cancellationToken)
{
using var scope = app.Services.CreateScope();
{
var logger = scope.ServiceProvider.GetRequiredService<ILogger<WebApplication>>();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var appliedMigrations = (await db.Database.GetAppliedMigrationsAsync(cancellationToken)).ToList();
var pendingMigrations = (await db.Database.GetPendingMigrationsAsync(cancellationToken)).ToList();
if (appliedMigrations.Count == 0 && pendingMigrations.Count == 0)
throw new Exception("no initial migration found");
if (pendingMigrations.Count > 0)
{
app.Logger.LogInformation("database migrations");
var migrator = db.Database.GetInfrastructure().GetService<IMigrator>();
if (migrator is null)
throw new Exception($"unable to retrieve db migrator");
foreach (var migration in pendingMigrations)
{
await migrator.MigrateAsync(migration, cancellationToken);
}
}
}
}
}