1. ホーム
  2. c#

[解決済み] Entity Framework Coreでデータベースを自動作成する

2022-05-16 16:24:17

質問

.NET core に移植される私のアプリケーションは、SQLite を備えた新しい EF Core を使用します。私は、アプリが最初に実行されたときに、データベースとテーブル構造を自動的に作成したいと思います。EFコアのドキュメントによると、これは手動コマンドを使用して行われます。

dotnet ef migrations add MyFirstMigration

dotnet ef database update

しかし、私はエンドユーザーがこれらのコマンドを入力することを望んでおらず、アプリが最初の使用時にデータベースを作成し設定することを希望しています。EF 6 には、次のような機能があります。

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

しかし、EFコアでは、これらは存在しないように見えます。私は、EFコアに相当する何かについての例またはドキュメントを見つけることができませんし、それはEFコアのドキュメントで不足している機能のリストで言及されていません。私はすでにモデルクラスをセットアップしているので、モデルに基づいてデータベースを初期化するコードを書くことができますが、フレームワークがこれを自動的に行った場合、それははるかに簡単でしょう。私はモデルを自動で構築したり、マイグレートしたりしたくありません。

私はここで何かを見逃していますか、それともEFコアにテーブルの自動作成機能がないのでしょうか?

どのように解決するのですか?

マイグレーションを作成したのであれば、それを実行するために スタートアップ.cs を以下のようにします。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.Migrate();
      }
      
      ...

これは、追加したマイグレーションを使用してデータベースとテーブルを作成します。

もしEntity Framework Migrationsを使わず、代わりにDbContextモデルを最初の実行時にコンテキストクラスで正確に作成する必要があるなら、使用することができます。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.EnsureCreated();
      }
      
      ...

代わりに

データベースが作成されたことを確認する前に、データベースを削除する必要がある場合は、電話をかけます。

            context.Database.EnsureDeleted();

呼び出す直前 EnsureCreated()

から引用した。 http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html?highlight=entity