Korzystanie z frameworku Entity (code first) migracje w produkcji

Zastanawiam się nad wykorzystaniem migracji EF dla naszego projektu, a w szczególności do wykonywania zmian schematu w produkcji pomiędzy wydaniami.

Zauważyłem, że istnieje API do wykonywania tych migracji w czasie wykonywania przy użyciu klasy DbMigration, ale nie mogę znaleźć żadnych konkretnych przykładów.

Idealnie, chciałbym jeden plik DbMigration dla każdej zmiany bazy danych, a te zmiany mają być stosowane automatycznie przy uruchomieniu aplikacji od bieżącej wersji do najnowszej wersja.

Author: devdigital, 2012-06-01

4 answers

Istnieje Inicjalizator bazy danych, którego możesz użyć do migracji do najnowszej wersji podczas uruchamiania (lub lepiej, dbinitializer uruchomi się przy pierwszym dostępie do bazy danych), MigrateDatabaseToLatestVersion, używasz go w ten sposób:

Database.SetInitializer<ObjectContext>(
    new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());

Jeśli chodzi o posiadanie jednego pliku na migrację, jeśli włączysz automatyczne migracje, znajdziesz je w folderze Migrations (domyślnie) w katalogu głównym Twojego projektu.

Istotne informacje, z przykładami, tutaj: http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx

 73
Author: WDRust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 13:33:39

To też działa:

var configuration = new MyDbContextConfiguration();
configuration.TargetDatabase = new DbConnectionInfo(
    database.ConnectionString, database.ProviderName);

var migrator = new DbMigrator(configuration);
migrator.Update();
Możesz również zadzwonić:
migrator.GetPendingMigrations();

Aby uzyskać listę migracji, które należy zastosować.

 48
Author: mackie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 13:34:14

Ponieważ nie określiłeś, której wersji Visual Studio używasz lub bazy danych, dodam tutaj odpowiedź, aby powiedzieć, że w VS2015 z Microsoft SQL Server, jest to teraz niezwykle łatwe za pomocą narzędzia "Publikuj".

Nie musisz przejmować się API, o którym mówisz. Po prostu wykonaj swoją pracę lokalnie, zmieniając modele, stosując migracje itp., a następnie, gdy chcesz wypchnąć się na serwery wydania/testowania, użyj narzędzia publish.

Możesz wybrać, aby zastosować dowolne migracje wykonane lokalnie, na zdalny serwer przy pierwszym uruchomieniu aplikacji.

Po wykonaniu wszystkich migracji i wykonaniu wszystkiego lokalnie (w Dev env), publikujemy (klikamy prawym przyciskiem myszy projekt, klikamy " Publikuj..."Zaznacz pole wyboru" Wykonaj Kod pierwsze migracje (uruchamia się przy starcie aplikacji)" w zakładce "Ustawienia", a następnie zastosuje migracje przy pierwszym dostępie do aplikacji (więc będzie krótkie opóźnienie przy pierwszym uruchomieniu aplikacji czas).

Publish Web using Web-Deploy

Poradnik: https://msdn.microsoft.com/en-us/library/dd465337 (v=vs.110). aspx

Nauczyłem się tego wszystkiego, ponieważ musiałem to zrobić na serwerze Windows 2012: http://www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/

Powodzenia!

 6
Author: Worthy7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 00:11:26

Chciałem kontrolować, które migracje uruchamiane są jawnie w kodzie i po wielu poszukiwaniach udało mi się opracować następującą technikę bez potrzeby włączania klasy DbConfiguration lub automatycznych migracji:

public static void RunMigration(this DbContext context, DbMigration migration)
{            
    var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance);
    if (prop != null)
    {
        IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>;
        var generator = new SqlServerMigrationSqlGenerator();
        var statements = generator.Generate(operations, "2008");
        foreach (MigrationStatement item in statements)
            context.Database.ExecuteSqlCommand(item.Sql);
    }
}

A gdybyśmy mieli taką migrację:

public class CreateIndexOnContactCodeMigration : DbMigration
{
    public override void Up()
    {
        this.CreateIndex("Contacts", "Code");
    }

    public override void Down()
    {
        base.Down();
        this.DropIndex("Contacts", "Code");
    }
}

Użylibyśmy go w ten sposób:

using (var dbCrm = new CrmDbContext(connectionString))
{
    var migration = new CreateIndexOnContactCodeMigration();
    migration.Up();                
    dbCrm.RunMigration(migration);
}
Pozdrawiam.
 2
Author: Panos Roditakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 13:02:05