gpt4 book ai didi

c# - 数据库重建后忽略挂起的迁移

转载 作者:行者123 更新时间:2023-11-30 21:02:54 25 4
gpt4 key购买 nike

我们使用代码优先 EF 4.3.1 进行数据库迁移。有时我们删除数据库,让 EF 重新创建它,主要是为了本地开发目的。

有一个应用挂起迁移的过程,当重新创建数据库时,挂起迁移不是必需的,当 EF 尝试应用它们时会抛出错误。

我从字符串中检查迁移日期,如果这是在数据库创建日期之前,那么我将其手动添加到 __migrationHistory 表中并且不应用迁移。

这涵盖了大多数场景,除了当有人重新创建数据库、从源代码管理更新和检索数据库创建日期之前的未完成迁移时。

我还尝试在 dbMigrator.Update(migration) 方法调用周围使用 try catch,但如果一个迁移失败,则不会应用其他迁移,因为它会记住异常。

有没有人找到解决这个问题的方法?

这是我写的方法:

private static void ApplyMigration<T, TU>()
where T : DbContext, new()
where TU : DbMigrationsConfiguration, new()
{
var migrationsAlreadyApplied = new List<string>();
var dbMigrator = new DbMigrator(new TU());

var creationMigrationId = dbMigrator.GetDatabaseMigrations().Single(m => m.Contains("InitialCreate"));
var dbDateCreated = DateTime.ParseExact(creationMigrationId.Substring(0, 12), Constants.MigrationDateFormat, CultureInfo.InvariantCulture);

dbMigrator.GetPendingMigrations().ToList()
.ForEach(migration =>
{
var migrationDate = DateTime.ParseExact(migration.Substring(0, 12), Constants.MigrationDateFormat, CultureInfo.InvariantCulture);

if (migrationDate > dbDateCreated)
dbMigrator.Update(migration);
else
migrationsAlreadyApplied.Add(migration);
});

using (var dbContext = new T())
{
foreach(var migration in migrationsAlreadyApplied)
dbContext.Database.ExecuteSqlCommand("insert into __MigrationHistory "
+ "select '" + migration + "', Model, ProductVersion "
+ "from __MigrationHistory "
+ "where MigrationId = '" + migration + "'");
}
}

最佳答案

我现在已经解决了这个问题。

在我的 dbContext 初始化程序的种子方法中,我调用了一个将手动填充迁移历史记录的方法。然后,您可以使用 ApplyMigrations 方法正常调用迁移。

public class UserEntitiesContextInitializer : CreateDatabaseIfNotExists<UserEntitiesContext>
{
protected override void Seed(UserEntitiesContext context)
{
// Update migration history with existing migrations to prevent EF recognising them as pending migrations
DatabaseAdministration.UpdateMigrationHistory<UserEntitiesContext, UserEntitiesContextConfiguration>();
}
}

public static void UpdateMigrationHistory<T, TU>()
where T : DbContext, new()
where TU : DbMigrationsConfiguration, new()
{
using (var dbContext = new T())
{
var dbMigrator = new DbMigrator(new TU());

var creationMigrationId = dbMigrator.GetDatabaseMigrations().Single(m => m.Contains("InitialCreate"));

foreach (var migration in dbMigrator.GetPendingMigrations())
dbContext.Database.ExecuteSqlCommand("insert into __MigrationHistory "
+ "select '" + migration + "', Model, ProductVersion "
+ "from __MigrationHistory "
+ "where MigrationId = '" + creationMigrationId + "'");
}
}

private static void ApplyMigration<T, TU>()
where T : DbContext, new()
where TU : DbMigrationsConfiguration, new()
{
var dbMigrator = new DbMigrator(new TU());

if (dbMigrator.GetPendingMigrations().Any())
dbMigrator.Update(dbMigrator.GetPendingMigrations().Last());
}

关于c# - 数据库重建后忽略挂起的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13155292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com