更新
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user