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.
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
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ć.
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).
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!
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.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