我有一个特殊的数据库脚本,需要作为最后一个迁移脚本运行,每次我在数据库上运行迁移时都需要运行(即使它之前已经运行过)。
我可以使用非常大的迁移ID来确保此迁移最后运行。但是,我不知道如何强制每次强制重新运行此迁移:一旦运行,它就会被添加到dbo.VersionInfo
表中,下次FluentMigrator在该表中看到它时,它不会再次运行它。
[Migration ( 209912312359 )]
public class M209912312359 : Migration
{
public override void Down ()
{
// I want this particular migration to always run
// as the last migration script and to run every time.
}
}
是否有某种迁移属性告诉FluentMigrator每次运行此脚本而不管以前的运行情况如何? (Migration
基类没有任何要覆盖的内容。)
我正在使用FluentMigrator 1.4。
修改
这是一种清理数据库中某些数据的数据迁移。在工作中,我们有大量的数据库(相同的模式,不同的数据)。一个特定的表(让我们称之为dbo.A
)必须在所有数据库中以相同的顺序具有相同的数据。我们使用迁移向此表添加数据,但有时 - 取决于在特定数据库中运行的迁移 - dbo.A
的实例可能会不同步。
此迁移的目的是确保dbo.A
的所有实例包含相同顺序的相同数据。我们无法删除dbo.A
并只是重新创建它,因为其ID
列用作外键。
我希望有一个迁移解决方案,如果可能的话,因为迁移是唯一可以保证在我们所有环境中作为部署的一部分运行的东西,并且更改这将非常困难。 (如果FluentMigrator无法做到这一点,我们可能无法做出选择。)
答案 0 :(得分:2)
为了解决您的问题,我刚刚创建了一个实现Down方法的抽象类,并在新的Migrations类上继承它。
public abstract class MigrationBase : FluentMigrator.Migration
{
public override void Down()
{
//Do what you want for every migration
}
}
[FluentMigrator.Migration(209912312359)]
public class M209912312359 : MigrationBase
{
public override void Up()
{
//New migration...
}
}
答案 1 :(得分:2)
从上面的评论中了解了这一点,但这可能对其他人有帮助
using FluentMigrator;
using System;
namespace Example
{
[Maintenance(MigrationStage.AfterAll)]
public class RefreshAllViews : FluentMigrator.Migration
{
public override void Up()
{
Execute.Sql(@"
DECLARE views_cursor CURSOR FOR
SELECT name FROM sysobjects WHERE type = 'V' AND uid = 1
OPEN views_cursor
DECLARE @view NVARCHAR(500)
FETCH NEXT FROM views_cursor INTO @view
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC sp_refreshview @view
END TRY
BEGIN CATCH
PRINT 'VIEW NAME: ' + @view +
', ERROR NUMBER: ' + Cast(ERROR_NUMBER() as VARCHAR) +
', ERROR MESSAGE: ' + ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM views_cursor INTO @view
END
CLOSE views_cursor
DEALLOCATE views_cursor");
}
public override void Down()
{
throw new NotImplementedException();
}
}
}
答案 2 :(得分:1)
似乎您必须使用MaintenanceAttribute或使用Execute.Sql命令执行其他操作,它将从VersionInfo表中删除迁移记录。