0
我們使用的是.NET4.5
,SQL2012
和FluentMigrator
to control our database migrations。我們在解決方案中運行多個數據庫,我們需要將一些數據插入到一些數據庫中,而不是其他數據庫中。如何使用fluentMigrator只運行特定數據庫名稱上的遷移
如何根據特定數據庫名稱運行某些數據庫遷移?
我們使用的是.NET4.5
,SQL2012
和FluentMigrator
to control our database migrations。我們在解決方案中運行多個數據庫,我們需要將一些數據插入到一些數據庫中,而不是其他數據庫中。如何使用fluentMigrator只運行特定數據庫名稱上的遷移
如何根據特定數據庫名稱運行某些數據庫遷移?
我已經介紹了這個類來控制它應該運行的數據庫。因此,而從Migration
繼承時,你會從現在繼承OnlyRunOnSpecificDatabaseMigration
:
一注!:它不會退卻到默認行爲(運行遷移)如果沒有在DatabaseNamesToRunMigrationOnList
列出的數據庫 - 其中一些可能會發現反直覺
namespace Infrastructure.Migrations
{
using System.Collections.Generic;
using FluentMigrator;
using FluentMigrator.Infrastructure;
public abstract class OnlyRunOnSpecificDatabaseMigration : Migration
{
public abstract List<string> DatabaseNamesToRunMigrationOnList { get; }
private bool DoRunMigraton(IMigrationContext context)
{
return this.DatabaseNamesToRunMigrationOnList == null ||
this.DatabaseNamesToRunMigrationOnList.Contains(new System.Data.SqlClient.SqlConnectionStringBuilder(context.Connection).InitialCatalog);
}
public override void GetUpExpressions(IMigrationContext context)
{
if (this.DoRunMigraton(context))
{
base.GetUpExpressions(context);
}
}
public override void GetDownExpressions(IMigrationContext context)
{
if (this.DoRunMigraton(context))
{
base.GetDownExpressions(context);
}
}
}
}
使用示例:
public class RiskItems : OnlyRunOnSpecificDatabaseMigration
{
public override void Up()
{
Execute.Sql(@"update [Items] set
CanBeX =
case when exists(select 1 from [SomeTable] where Key = [Items].Key and position like 'Factor%') then 1 else 0 end");
}
public override void Down()
{
}
public override List<string> DatabaseNamesToRunMigrationOnList
{
get
{
return new List<string> {"my_database_name"};
}
}
}
這Q/A救了我很多的時間,我希望它獲得更多的upvotes。也許添加一些上下文,如「FM運行它可以在給定的dll中找到的所有遷移」,「標記屬性對於特定的遷移非常有用,但它們的用途當然不是普遍的」,「文檔告訴你如何定位不同的DBMS,但沒有關於不同的數據庫「所以很顯然,文件是貧血的,而不是你在詢問之前沒有做過適當的搜索。 –
@RenaudGauthier嗨Renaud,原因這個Q不起作用不是措辭(標題對應於答案中的內容),但問題是非常小衆,只是看看意見......我也不在乎足夠的TBH .. 。幫助SO的人並不是很有意義,所以我退休了。 –