私たちのプロジェクト、特にリリース間で本番環境でスキーマの変更を実行するために EF 移行を使用することを検討しています。
クラスを使用して実行時にこれらの移行を実行する API があると述べたのを見たことがありますがDbMigration
、具体的な例は見つかりません。
理想的には、DbMigration
データベースの変更ごとに 1 つのファイルが必要であり、それらの変更がアプリケーションの起動時に現在のバージョンから最新バージョンまで自動的に適用されるようにします。
私たちのプロジェクト、特にリリース間で本番環境でスキーマの変更を実行するために EF 移行を使用することを検討しています。
クラスを使用して実行時にこれらの移行を実行する API があると述べたのを見たことがありますがDbMigration
、具体的な例は見つかりません。
理想的には、DbMigration
データベースの変更ごとに 1 つのファイルが必要であり、それらの変更がアプリケーションの起動時に現在のバージョンから最新バージョンまで自動的に適用されるようにします。
起動時に最新バージョンへの移行を実現するために使用できるデータベース初期化子があります (または、最初の db アクセスで dbinitializer が開始されます)。次のMigrateDatabaseToLatestVersion
ように使用します。
Database.SetInitializer<ObjectContext>(
new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());
移行ごとに 1 つのファイルを持つことに関して、自動移行を有効にするMigrations
と、プロジェクトのルートにあるフォルダー (デフォルト) にそれらが見つかります。
これも機能します:
var configuration = new MyDbContextConfiguration();
configuration.TargetDatabase = new DbConnectionInfo(
database.ConnectionString, database.ProviderName);
var migrator = new DbMigrator(configuration);
migrator.Update();
次のように呼び出すこともできます。
migrator.GetPendingMigrations();
適用する必要がある移行のリストを取得します。
使用しているVisual Studioのバージョンまたはデータベースを指定しなかったため、ここに回答を追加して、MicrosoftのSQL Serverを使用したVS2015では、「公開」ツールを使用すると非常に簡単になりました.
あなたが話しているAPIを気にする必要はありません。モデルの変更、移行の適用などの作業をローカルで行うだけで、リリース/テスト サーバーにプッシュする場合は、公開ツールを使用します。
アプリケーションの初回起動時に、ローカルで行った移行をリモート サーバーに適用することを選択できます。
すべての移行とローカルでのすべての作業が完了したら (おそらく開発環境で)、公開します (プロジェクトを右クリックし、[公開...] をクリックします) の下にある [コードを最初に移行して実行 (アプリケーションの起動時に実行)] チェックボックスをオンにします。 [設定] タブをクリックすると、アプリに初めてアクセスしたときに移行が適用されます (そのため、初回は少し遅れます)。
ガイド: https://msdn.microsoft.com/en-us/library/dd465337(v=vs.110).aspx
Windows 2012サーバーに対してこれを行う必要があったため、これらすべてを学びました: http://www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/
幸運を!
どの移行をコードで明示的に実行するかを制御したかったので、多くの検索を行った後、DbConfiguration クラスや自動移行を有効にする必要なく、次の手法を開発することができました。
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);
}
}
そして、次のような移行があるとします。
public class CreateIndexOnContactCodeMigration : DbMigration
{
public override void Up()
{
this.CreateIndex("Contacts", "Code");
}
public override void Down()
{
base.Down();
this.DropIndex("Contacts", "Code");
}
}
次のように使用します。
using (var dbCrm = new CrmDbContext(connectionString))
{
var migration = new CreateIndexOnContactCodeMigration();
migration.Up();
dbCrm.RunMigration(migration);
}
よろしく。