18

私はASP.NET MVC 6アプリケーションを持っています。私はDatabase.EnsureCreatedメソッドとDatabase.Migrateメソッドを呼び出す必要があります。Database.EnsureCreatedとDatabase.Migrateの呼び出し方法と場所はどこですか?

しかし、どこで呼びますか?ちょうどあなたがローワン・ミラーからthisをお読みくださいforewardとして

+0

いずれかを使用したくない場合もあります。 MSのドキュメントでは、Migrate()の使用についてこう述べています。「ローカルデータベースを使用するアプリケーションには最適ですが、ほとんどのアプリケーションではSQLスクリプトの作成など、より堅牢な導入戦略が必要になります。 https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/ –

答えて

6

を... EnsureCreatedは完全移行を迂回し、あなたのためだけに スキーマを作成するには、マイグレーションでこれを混在させることはできません。 EnsureCreatedは が毎回データベースを削除して再作成していることを確認しているテストまたはラピッドプロトタイピング用に設計された です。 の移行を使用していて、アプリの開始時に自動的に適用される場合は、 の代わりにcontext.Database.Migrate()を使用できます。次のように

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()を定義します:

スタートアップ機能Startup.cs中:

あなたはGlobals.EnsureDatabaseCreated();それStartup.csを追加する必要がhereに答えるためによると

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を参照してください。

+0

こんにちはジェームス、あなたの答えをありがとう!、私は戦いの名前にアクセスする必要はありません私のスタートアップでグローバル方法、どうすればそれにアクセスできますか? –

19

私はこれが重要な質問だと思います。

EnsureCreatedとは何ですか?

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

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

私たちはEF 6でどのようにしましたか?

EnsureCreatedは、EF 6の下に記載されている手法と同等です:

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

    有効-移行-EnableAutomaticMigrations。追加マイグレーション/更新データベース。コードから

  2. Database.SetInitializer CreateDatabaseIfNotExists

又はDbMigrationsConfigurationで

とAutomaticMigrationsEnabled = trueを設定します。

Database.Migrateとは何ですか?

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

私たちはEF 6でどのようにしましたか?

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

    アップデート - データベース-TargetMigration

  2. context.Database.Migrateは()EF 6の下に記載されたアプローチに相当しますカスタムDbMigrationsConfiguration:

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

結論

あなたが移行を使用している場合がcontext.Database.Migrateあります()。マイグレーションが不要で、簡単なデータベース(通常はテスト用)が必要な場合は、context.Database.EnsureCreated()/ EnsureDeleted()を使用します。

+2

こんにちはBassam Alugili、あなたの答えに感謝します!私のプロジェクトでは、私は移行を使用している、私は一緒に両方の方法を使用するべきではないことを知っていなかった。 –

+1

uwとここにそれを呼び出す方法の例です! http://www.stefanhendriks.com/2016/04/29/integration-testing-your-dot-net-core-app-with-an-in-memory-database/ –

+0

私は 'Database.Migrate( ) 'creats migrations(必要な場合)は、ベースのベースを更新します。 EF 6の自動移行に似ていますが、私は間違っていました。データベース上の既存のマイグレーション(存在する場合)のみを適用します。 –

5

James PとBassam Alugiliが提供した情報を元に、私はこのコード行をStartup.cs-> Configureメソッドに追加しました。

try 
      { 
       using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>() 
        .CreateScope()) 
       { 

        serviceScope.ServiceProvider.GetService<ApplicationDbContext>() 
         .Database.Migrate(); 
       } 
      } 
      catch (Exception e) 
      { 
       var msg = e.Message; 
       var stacktrace = e.StackTrace; 
      } 
関連する問題