ASP.NET MVC 6アプリケーションがあり、Database.EnsureCreated
およびDatabase.Migrate
メソッドを呼び出す必要があります。
しかし、どこに電話すればいいですか?
これは重要な質問であり、よく答えられるべきだと思います!
Database.EnsureCreatedとは
context.Database.EnsureCreated()
は、コンテキストのデータベースが存在することを保証する新しいEFコアメソッドです。存在する場合、アクションは実行されません。存在しない場合は、データベースとそのすべてのスキーマが作成され、このコンテキストのモデルとの互換性が確保されます。
注:この方法では、移行を使用してデータベースを作成しません。また、作成されたデータベースは、移行を使用して後で更新することはできません。リレーショナルデータベースを対象とし、移行を使用している場合は、DbContext.Database.Migrate()
メソッドを使用して、データベースが作成され、すべての移行が適用されることを確認できます。
EF 6でどのようにしたのですか?
context.Database.EnsureCreated()
は、以下にリストされているEF 6のアプローチと同等です。
パッケージマネージャーコンソール:
Enable-Migrations -EnableAutomaticMigrations。 Add-Migration/Update-Database。
コードから:
Database.SetInitializer CreateDatabaseIfNotExists
または
DbMigrationsConfigurationを使用し、AutomaticMigrationsEnabled = trueを設定;
Database.Migrateとは?
コンテキストの保留中の移行をデータベースに適用します。データベースがまだ存在しない場合は作成します。
EF 6でどのようにしたのですか?
context.Database.Migrate()
は、以下にリストされているEF 6のアプローチと同等です。
パッケージマネージャーコンソール:
Update-Database -TargetMigration
カスタムDbMigrationsConfigurationの場合:
AutomaticMigrationsEnabled = false;またはDbMigratorを使用します。
結論:
移行を使用している場合、context.Database.Migrate()
があります。移行が不要で、(通常はテスト用の)クイックデータベースが必要な場合は、context.Database.EnsureCreated()/ EnsureDeleted()を使用します。
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();
前置きとして、ローワンミラーから 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();
}
さらに、コンテキストのコンストラクターでこれを呼び出すと、パフォーマンスが低下する場合があります... EnsureCreated
をsetup.csユーティリティに移動した後、応答時間が大幅に改善されていることに気付きました。
注:EFCとUWPを使用しています。