2016-07-21 13 views
0

Мы используем , SQL2012 и FluentMigratorto control our database migrations. Мы используем несколько баз данных в нашем решении, и нам нужно запустить некоторые вставки данных в некоторые базы данных, но не в другие.Как запустить миграцию только с определенным именем базы данных при использовании fluentMigrator

Как я могу выполнить некоторые миграции баз данных на основе определенного имени базы данных?

+0

Это Q/A спас меня много времени, и я хочу это получить больше upvotes. Возможно, добавьте некоторый контекст, например: «FM запускает все миграции, которые он может найти в данной DLL», «атрибуты тега полезны для определенных миграций, но их цель, разумеется, не будет широко распространена» и «документация рассказывает вам, как настроить таргетинг на разные СУБД, но нет ничего о разных БД », поэтому ясно, что документация анемична, в отличие от того, что вы не сделали правильный поиск, прежде чем спрашивать. –

+0

@RenaudGauthier Привет Рено, причина, по которой этот Q не получает upvotes, не формулируется (название соответствует тому, что находится в ответе), но вопрос - очень ниша, просто посмотрите на взгляды ... также мне все равно TBH .. Помогать людям в этом не очень полезно, поэтому я «вышел на пенсию». –

ответ

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"}; 
     } 
    } 
}