2016-06-28 9 views
2

マイグレーションを有効にし、AutomaticMigrationsEnabledが無効で、コードイニシャライザーがMigrateDatabaseToLatestVersionに設定されたコードファーストシナリオがあります。私は、ログの目的のために移行イベントを "キャッチ"したいと思います。EF6コードファーストマイグレーション:イベントのマイグレーション

私はSeed()でそれをやろうとしましたが、基になるデータベースがモデルに一致するかどうかに関係なく、すべてのシングルランと呼ばれています。

これを行う適切な方法はありますか?あなたは、移行が必要な場合

+0

これはあなたが探しているものではありませんが、iを含む '[dbo]。[MigrationHistory]'テーブルがありますデータベースに適用されたすべての移行に関する情報。 –

+0

はい、わかりましたが、移行のタイムスタンプに関する情報は(たとえば)含まれていません。 EFがそれを発生させると、移行を記録する必要があります –

答えて

2

ソリューション1)

チェック:

var migrator = new DbMigrator(new DbMigrationsConfiguration()); 

    // If any migration is required then Count will be greater than 0 
    // 0 means no migration required 
    if (migrator.GetPendingMigrations().Count() > 0) 
    { 
    // Fire your event here! 
    } 

Soultion 2) あなたがイベントを必要としないこのユースケースでは、進捗状況をログに記録するログデコレータを使用してください。

public class MyLogger : System.Data.Entity.Migrations.Infrastructure.MigrationsLogger 
{ 
    public override void Info(string message) 
    { 
     // Short status messages come here 
    } 

    public override void Verbose(string message) 
    { 
     // The SQL text and other info comes here 
    } 

    public override void Warning(string message) 
    { 
     // Warnings and other bad messages come here 
    } 
} 

が最新バージョンに移行するには、そのようにそれを呼び出す必要があり:

DbMigrator migrator = new DbMigrator(new MyConfiguration()); 
MigratorLoggingDecorator logger = new MigratorLoggingDecorator(migrator, new MyLogger()); 
// This line will call the migration + logging 
logger.Update(); 

追加情報:

MyMigratorLoggingDecorator: MigratorLoggingDecorator { 

    internal override Upgrade(IEnumerable<string> pendingMigrations, string targetMigrationId, string lastMigrationId) 
    { 
    // Fire your event here! 
    base.Upgrade(..) 
    } 
..} 

あなたはそのようなカスタムMigratorLoggingDecoratorのdecroatorを作成することができます

関連する問題