質問: 私はEntity Framework Core + ASP.NET Coreアプリケーションを持っています。アプリケーションが起動すると、データベースが作成され、最終的に(一度マイグレーションが完了したら)、それらも実行されていることを確認します。 当初、私は入れ`Database.EnsureCreated()`私のコンストラクタに`DbContext`それはの新しいインスタンスので、誰かが自分のアプリケーションを打つたびに実行するように見える`DbContext`するたびに作成されます。 私はそれを私のスタートアップコードに入れようとしましたが、 `DbContext`を行うには私の`DbContext`インスタンスが必要で、それをどうやって取得するのかははっきりしていません。私はEFを次のように設定しています: ``` serviceCollection.AddEntityFramework() .AddSqlServer() .AddDbContext(options => options.UseSqlServer(...)); ``` 私は、サービスコレクションからDbContextのインスタンスを取得する方法を見ていないし、DbContextを挿入するための適切なシングルトンが表示されないので、一度の初期化を行うことができます。 だから、私のDbContextに関連するコードをアプリケーションごとに一度呼び出すのに最適な場所は何ですか?
回答: とにかくあなたのサービスの一環としてEnsureCreatedを実行するためにあなたが走る理由は不思議です。あなたが*本当に*あなたのウェブサーバは、データベーススキーマを作成または更新しますか?なぜデータベースが最新で*ない*場合、Webサーバーが稼働していて、要求を処理するのですか? あなたは本当にあなたのマイグレーションを信用していますので、実行後にデータを破壊しないように、実行後にデータをテストする必要はありませんか? さらに、Webサーバーデータベースにデータベーススキーマを変更する権限を与える必要があります。これは脆弱性そのものです。あなたのウェブサーバーを引き継いでいる人は、あなたのデータベーススキーマを変更することができます。 データベースを作成し、マイグレーションを小さなユーティリティで適用することをお勧めします。これは、Webアプリケーションの一部ではなく、自分で実行します。