2016-06-28 2 views
2

У меня есть сценарий с первым кодом с включенными переходами, AutomaticMigrationsEnabled отключен, а инициализатор DB установлен в MigrateDatabaseToLatestVersion. Я хотел бы «поймать» события миграции для ведения журнала.EF6 Code First Migrations: migending events

Я попытался сделать это в Seed(), но он называется каждым прогоном независимо от того, нужна ли базовой базе данных миграция в соответствии с моделью или нет.

Есть ли правильный способ сделать это?

+0

Это не то, что вы ищете, но есть таблица '[dbo]. [__ MigrationHistory]', которая содержит i nformation о всех миграциях, которые были применены к базе данных. –

+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(); 

Дополнительно:

Вы можете создать свой собственный MigratorLoggingDecorator decroator подобное:

MyMigratorLoggingDecorator: MigratorLoggingDecorator { 

    internal override Upgrade(IEnumerable<string> pendingMigrations, string targetMigrationId, string lastMigrationId) 
    { 
    // Fire your event here! 
    base.Upgrade(..) 
    } 
..} 
Смежные вопросы