69

私たちのプロジェクト、特にリリース間で本番環境でスキーマの変更を実行するために EF 移行を使用することを検討しています。

クラスを使用して実行時にこれらの移行を実行する API があると述べたのを見たことがありますがDbMigration、具体的な例は見つかりません。

理想的には、DbMigrationデータベースの変更ごとに 1 つのファイルが必要であり、それらの変更がアプリケーションの起動時に現在のバージョンから最新バージョンまで自動的に適用されるようにします。

4

5 に答える 5

81

起動時に最新バージョンへの移行を実現するために使用できるデータベース初期化子があります (または、最初の db アクセスで dbinitializer が開始されます)。次のMigrateDatabaseToLatestVersionように使用します。

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

移行ごとに 1 つのファイルを持つことに関して、自動移行を有効にするMigrationsと、プロジェクトのルートにあるフォルダー (デフォルト) にそれらが見つかります。

例を含む関連情報: http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx

于 2012-06-01T13:08:58.117 に答える
49

これも機能します:

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

var migrator = new DbMigrator(configuration);
migrator.Update();

次のように呼び出すこともできます。

migrator.GetPendingMigrations();

適用する必要がある移行のリストを取得します。

于 2012-08-06T08:08:47.977 に答える
8

使用しているVisual Studioのバージョンまたはデータベースを指定しなかったため、ここに回答を追加して、MicrosoftのSQL Serverを使用したVS2015では、「公開」ツールを使用すると非常に簡単になりました.

あなたが話しているAPIを気にする必要はありません。モデルの変更、移行の適用などの作業をローカルで行うだけで、リリース/テスト サーバーにプッシュする場合は、公開ツールを使用します。

アプリケーションの初回起動時に、ローカルで行った移行をリモート サーバーに適用することを選択できます。

すべての移行とローカルでのすべての作業が完了したら (おそらく開発環境で)、公開します (プロジェクトを右クリックし、[公開...] をクリックします) の下にある [コードを最初に移行して実行 (アプリケーションの起動時に実行)] チェックボックスをオンにします。 [設定] タブをクリックすると、アプリに初めてアクセスしたときに移行が適用されます (そのため、初回は少し遅れます)。

Web-Deploy を使用して Web を公開する

ガイド: 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/

幸運を!

于 2016-06-03T00:11:26.770 に答える
4

どの移行をコードで明示的に実行するかを制御したかったので、多くの検索を行った後、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);
}

よろしく。

于 2016-01-13T13:02:05.370 に答える