我需要将一些数据从数据库移动到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迁移之外的其他方法来移动数据?