2016-07-21 78 views
0

我們使用的是.NET4.5,SQL2012FluentMigratorto control our database migrations。我們在解決方案中運行多個數據庫,我們需要將一些數據插入到一些數據庫中,而不是其他數據庫中。如何使用fluentMigrator只運行特定數據庫名稱上的遷移

如何根據特定數據庫名稱運行某些數據庫遷移?

+0

這Q/A救了我很多的時間,我希望它獲得更多的upvotes。也許添加一些上下文,如「FM運行它可以在給定的dll中找到的所有遷移」,「標記屬性對於特定的遷移非常有用,但它們的用途當然不是普遍的」,「文檔告訴你如何定位不同的DBMS,但沒有關於不同的數據庫「所以很顯然,文件是貧血的,而不是你在詢問之前沒有做過適當的搜索。 –

+0

@RenaudGauthier嗨Renaud,原因這個Q不起作用不是措辭(標題對應於答案中的內容),但問題是非常小衆,只是看看意見......我也不在乎足夠的TBH .. 。幫助SO的人並不是很有意義,所以我退休了。 –

回答

1

我已經介紹了這個類來控制它應該運行的數據庫。因此,而從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"}; 
     } 
    } 
} 
相關問題