2013-03-22 4 views
6

У меня есть простая миграция с AutomaticMigrationsEnabled = false. Все отлично работает с визуальной студией или при использовании MigrateDatabaseToLatestVersion.Миграции Entity Framework - Семенной пробег, даже если нет миграции?

Однако это не идеально для меня. Я хотел бы запускать миграции из сценария развертывания на моем сервере ci. Я нашел this article, объяснив, как это сделать, используя migrate.exe , но это кажется всегда запустить семя. Это происходит даже тогда, когда миграция не применяется.

Нужно ли программно проверять метод Seed, были ли выполнены какие-либо миграции? Как мне это сделать?

+0

Почему бы не сделать ваше семя идемпотентным? –

+0

@LukeMcGregor - Если я хочу вставить некоторые данные, как бы я это сделал без явно жестких клавиш кодирования или выполнения пользовательских проверок на каждой таблице для upsorts? –

+1

лично я жестко-кодовые ключи для данных семени, учитывая, что его семя его статично в любом случае IMO –

ответ

5

Использовать DbMigrator для ручного обновления Update() только в случае ожидающих миграции. Он был внедрен в Entity Framework 5.0.

private void MigrateAndSeedDbIfSchemaIsOutdated() 
{ 
    // Disable initializer. 
    Database.SetInitializer<MyContext>(null); 

    // Make sure database exists. 
    using (var db = new MyContext()) 
    { 
     db.Database.Initialize(false); 
    } 

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

    if (migrator.GetPendingMigrations().Any()) 
    { 
     // Run migrations and seed. 
     migrator.Update(); 
    } 
} 
+0

Ах, не знал об этом методе спасибо! Заметка о вашем LINQ - здесь нет необходимости вызывать 'ToList', вы можете просто оставить pendingMigrations как' IEnumerable <> 'и называть' .Any() 'на этом. Вызов 'ToList' заставляет все перечисление оценивать, тогда как вам остается только, есть ли в нем хотя бы один элемент. –

+0

Вы правы, я использовал эту часть для отладки. Я отредактировал ответ. – angularsen

Смежные вопросы