This commit is contained in:
GukSang.Jin
2026-03-20 16:23:56 +08:00
parent 252dc17747
commit ac05493177
11 changed files with 580 additions and 143 deletions

View File

@@ -71,6 +71,7 @@ using (var scope = app.Services.CreateScope())
}
EnsurePackageTimingColumns(db, logger);
EnsureOrderPaymentColumns(db, logger);
foreach (var package in PackageCatalog.DefaultPackages)
{
@@ -186,3 +187,52 @@ static List<(string Name, int DefaultValue)> GetMissingPackageTimingColumns(DbCo
.Where(column => !existingColumns.Contains(column.Name))
.ToList();
}
static void EnsureOrderPaymentColumns(PetWashDbContext db, ILogger logger)
{
var providerName = db.Database.ProviderName ?? string.Empty;
var isSqlite = providerName.Contains("Sqlite", StringComparison.OrdinalIgnoreCase);
var missingColumns = GetMissingOrderPaymentColumns(db.Database.GetDbConnection(), isSqlite);
foreach (var column in missingColumns)
{
var sql = isSqlite
? $"ALTER TABLE Orders ADD COLUMN {column.Name} {column.SqliteTypeClause};"
: $"ALTER TABLE Orders ADD COLUMN {column.Name} {column.MySqlTypeClause};";
db.Database.ExecuteSqlRaw(sql);
logger.LogInformation("Added missing order payment column {ColumnName}", column.Name);
}
}
static List<(string Name, string SqliteTypeClause, string MySqlTypeClause)> GetMissingOrderPaymentColumns(
DbConnection connection,
bool isSqlite)
{
var expectedColumns = new List<(string Name, string SqliteTypeClause, string MySqlTypeClause)>
{
("OutTradeNo", "TEXT NOT NULL DEFAULT ''", "VARCHAR(128) NOT NULL DEFAULT ''"),
("PaymentCodeUrl", "TEXT NOT NULL DEFAULT ''", "VARCHAR(2048) NOT NULL DEFAULT ''"),
("PaymentExpiresAt", "TEXT NULL", "DATETIME NULL"),
("PaymentInitError", "TEXT NOT NULL DEFAULT ''", "VARCHAR(2048) NOT NULL DEFAULT ''")
};
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
using var command = connection.CreateCommand();
command.CommandText = isSqlite ? "PRAGMA table_info(Orders);" : "SHOW COLUMNS FROM Orders;";
using var reader = command.ExecuteReader();
var existingColumns = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
while (reader.Read())
{
existingColumns.Add(reader.GetString(isSqlite ? 1 : 0));
}
return expectedColumns
.Where(column => !existingColumns.Contains(column.Name))
.ToList();
}