web-dev-qa-db-ja.com

Database.EnsureCreatedおよびDatabase.Migrateを呼び出す方法と場所

ASP.NET MVC 6アプリケーションがあり、Database.EnsureCreatedおよびDatabase.Migrateメソッドを呼び出す必要があります。

しかし、どこに電話すればいいですか?

53

これは重要な質問であり、よく答えられるべきだと思います!

Database.EnsureCreatedとは

context.Database.EnsureCreated()は、コンテキストのデータベースが存在することを保証する新しいEFコアメソッドです。存在する場合、アクションは実行されません。存在しない場合は、データベースとそのすべてのスキーマが作成され、このコンテキストのモデルとの互換性が確保されます。

注:この方法では、移行を使用してデータベースを作成しません。また、作成されたデータベースは、移行を使用して後で更新することはできません。リレーショナルデータベースを対象とし、移行を使用している場合は、DbContext.Database.Migrate()メソッドを使用して、データベースが作成され、すべての移行が適用されることを確認できます。

EF 6でどのようにしたのですか?

context.Database.EnsureCreated()は、以下にリストされているEF 6のアプローチと同等です。

  1. パッケージマネージャーコンソール:

    Enable-Migrations -EnableAutomaticMigrations。 Add-Migration/Update-Database。

  2. コードから:

    Database.SetInitializer CreateDatabaseIfNotExists

または

DbMigrationsConfigurationを使用し、AutomaticMigrationsEnabled = trueを設定;

Database.Migrateとは?

コンテキストの保留中の移行をデータベースに適用します。データベースがまだ存在しない場合は作成します。

EF 6でどのようにしたのですか?

context.Database.Migrate()は、以下にリストされているEF 6のアプローチと同等です。

  1. パッケージマネージャーコンソール:

    Update-Database -TargetMigration

  2. カスタムDbMigrationsConfigurationの場合:

    AutomaticMigrationsEnabled = false;またはDbMigratorを使用します。

結論

移行を使用している場合、context.Database.Migrate()があります。移行が不要で、(通常はテスト用の)クイックデータベースが必要な場合は、context.Database.EnsureCreated()/ EnsureDeleted()を使用します。

66
Bassam Alugili

James PとBassam Alugiliが提供した情報を使用して、最終的にこれらのコード行をConfigureクラスのStartupメソッドに追加しました(Startup.cs ):

using (var scope = 
  app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
using (var context = scope.ServiceProvider.GetService<MyDbContext>())
    context.Database.Migrate();
15

前置きとして、ローワンミラーから this を読む必要があります。

... EnsureCreatedは移行を完全にバイパスし、スキーマを作成するだけです。これを移行と混在させることはできません。 EnsureCreatedは、テストまたはラピッドプロトタイピング用に設計されており、毎回データベースをドロップおよび再作成しても問題ありません。移行を使用していて、アプリの起動時にそれらを自動的に適用する場合は、代わりにcontext.Database.Migrate()を使用できます。

答えによると こちらGlobals.EnsureDatabaseCreated();Startup.csに追加する必要があります:

Startup.csのスタートアップ関数:

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        // This will Push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
            builder.AddApplicationInsightsSettings(developerMode: true);
    }
    Configuration = builder.Build();
    Globals.Configuration = Configuration;
    Globals.HostingEnvironment = env;
    Globals.EnsureDatabaseCreated();
}

そして、Globals.EnsureDatabaseCreated()を次のように定義します。

public static void EnsureDatabaseCreated()
    {
        var optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:DataContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:DataContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:DataContext"]);
        var context = new ApplicationContext(optionsBuilder.Options);
        context.Database.EnsureCreated();

        optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:TransientContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:TransientContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:TransientContext"]);
        new TransientContext(optionsBuilder.Options).Database.EnsureCreated();
    }

context.Database.Migrate()を使用するには、 here または here を参照してください。

13
James P

さらに、コンテキストのコンストラクターでこれを呼び出すと、パフォーマンスが低下する場合があります... EnsureCreatedをsetup.csユーティリティに移動した後、応答時間が大幅に改善されていることに気付きました。

注:EFCとUWPを使用しています。

0
visc