Запуск EF-миграции при запуске приложения по коду - PullRequest
6 голосов
/ 14 декабря 2011

Использование Entity Framework Migrations (Beta1), использование команды Update-Database - все хорошо во время разработки.

Но когда приложение работает на каком-то сервере клиента, я действительно хочу, чтобы мое приложение автоматически обновляло свою схему базы данных до последней версии при запуске.

Возможно ли это? Документация скудна.

Ответы [ 2 ]

11 голосов
/ 15 декабря 2011

Они не предоставляют способ сделать это до RTM, после чего они пообещали приложение для командной строки и поставщика msdeploy. Источник: http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx

Конечно, не удовлетворяясь этим, команда powershell хранится в каталоге пакетов и представляет собой простой текст, кажется, что она просто загружает сборку с именем EntityFramework.Migrations.Commands, хранящуюся в том же каталоге.

Прослеживая эту сборку, я придумал следующее

public class MyContext : DbContext
{
  static MyContext()
  {
    DbMigrationsConfiguration configuration = new DbMigrationsConfiguration() {
      MigrationsAssembly = typeof(MyContext).Assembly,
      ContextType = typeof(MyContext),
      AutomaticMigrationsEnabled = true,                
    };

    DbMigrator dbMigrator = new DbMigrator(configuration);          
    dbMigrator.Update(null);            
  }
}

ОБНОВЛЕНИЕ: после небольшого количества экспериментов я выяснил еще несколько вещей

  • Выполнение обновления в статическом конструкторе для вашего контекста плохо, поскольку оно нарушает команды powershell, намного лучше добавлять код для запуска приложения другим способом (Global.asax, WebActivator или метод Main)
  • Приведенный выше код работает только при использовании AutomaticMigrations, вам нужно настроить пространство MigrationsNamespace, чтобы оно могло срабатывать при созданных вручную миграциях
  • Класс конфигурации, который я создавал, должен уже существовать в вашем проекте (добавляется при установке пакета миграции nuget), поэтому просто создайте его экземпляр.

Это означает, что код упрощен до

DbMigrator dbMigrator = new DbMigrator(new NAMESPACE.TO.MIGRATIONS.Configuration());
dbMigrator.Update(null);        
4 голосов
/ 11 апреля 2015

Еще один вариант этой проблемы - добавить строку

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, NAMESPACE.TO.MIGRATIONS.Configuration>());

в метод Global.asax Application_Start.

...