如何在Entity Framework迁移失败时运行自定义代码?

时间:2015-12-16 15:06:09

标签: entity-framework database-migration ef-migrations

我需要将一些数据从数据库移动到Web服务。因此,我需要在迁移期间调用Web服务,并在删除包含表之前上载现有数据。如果数据上载失败,则不得删除该表。此外,如果在此迁移的其他步骤中发生异常,我还想从服务中删除数据。

如果我在Up方法中放置Web服务调用,则在迁移之前调用Web服务,如果服务调用抛出,则不会运行迁移。但是,我没有看到我可以在哪里放回滚代码。 Up方法中的语句只对要执行的操作进行排队,并且不执行任何数据库检查,因此添加catch将无济于事。

我现在看到的唯一可行解决方案是创建自己的迁移运行器,而不是使用migrate.exe并逐个运行迁移:

var migrator = new DbMigrator(new MyMigrationConfiguration());
var pendingMigrations = migrator.GetPendingMigrations();
foreach (var migration in pendingMigrations)
{
    try
    {
        migrator.Update(migration);
    }
    catch (SqlException)
    {
        if (migration == "MoveDataToWebService")
        {
            // Delete data from service
        }

        throw;
    }
}

是否有任何内置方法可以处理迁移失败,因此我可以从Visual Studio或migrate.exe运行迁移?或者我对原始任务的处理方法是错误的,我应该使用除EF迁移之外的其他方法来移动数据?

0 个答案:

没有答案