質問: !dbContext.ConfigurationValue.Any() // throws exception ? CreateAndSaveDefaultValues(dbContext) : dbContext.ConfigurationValue.ToDictionary(c => c.Id, c => c.Value); ``` データベースがまだ作成されていないため、データベースにアクセスしようとすると`SQLException`がスローされます。 しかし、 `dbContext.Database.EnsureCreated()`を使用しようとすると、テーブルがすでに存在するため、最初の移行は失敗します。私は代わりに`dbContext.Database.Migrate()`を試して`dbContext.Database.Migrate()`ことを考えましたが、初心者としては本番環境にとって意図しない結果が生じるかもしれないと心配しています。そのため、私はコマンドラインツールを使って移行を制御する方が好きです。 基本的には、データベースを作成する前に`BuildWebHost`追加されたカスタム設定プロバイダがデータベースを必要とする前に、 `"dotnet ef database update"` `BuildWebHost` `"dotnet ef database update"`がアプリケーションの起動( `BuildWebHost`実行するように`BuildWebHost`ます。 このジレンマをどうやって解決するのですか?
回答: ある意味では、循環参照を作成しました。 ASP.NETコアプロジェクトでマイグレーションを実行する場合、アプリケーションはマイグレーションを実行するために必要な`DbContext`をインスタンス化するように初期化されます。これは、という事実によるものである`DbContext` EFコアでは、現在必要と`DbContextOptions`接続文字列名(または実際の完全な接続文字列)を直接に定義されますEFで物事の古い方法とは対照的に、注入されるインスタンスをコンストラクタ 通常、これは正常に動作しますが、アプリケーションの初期化自体に既存のデータベースが必要なため、移行前にこれを実行する方法はありません。結果として、2つの選択肢があります。 1. 既存のデータベースが必要な部分を抽象化することができます。それはtry-catchでそれをラップし、例外を飲み込むか、より複雑なものにすることができます。移行ピースはこの特定の機能を必要としないため、そのシナリオでのアプリケーションの初期化から安全に除外できます。 2. コンテキストとエンティティをクラスライブラリに移動し、 `IDesignTimeDbContextFactory`を実装して、移行する`DbContext`を構築する能力を満たすことができます。その後、ASP.NETコアプロジェクトではなく、このクラスライブラリに対して移行を実行します。それは、移行を行うためにアプリケーションを初期化しなければならないという問題を回避します。