質問: 私はASP.NET Core 2.0でアプリケーションを構築しており、EntityFrameworkの移行に問題があります。 別のプロジェクト( *SolutionName* \ *ProjectNamePrefix* .Data)に私のDbContextがあるので、IDesignTimeDbContextFactoryインターフェイスの実装を作成しました。 異なる環境に異なる接続文字列を使用したいの`appsettings.json` 、そのために`appsettings.json`が必要です。 クイック検索の後、 `CreateDbContext`関数内に新しい`IConfigurationRoot`オブジェクトを作成することができます。https : `CreateDbContext` 私はそれを追加し、テストのために、Dataプロジェクトルートフォルダから`dotnet ef migrations list -c MyContext`を実行しようとしました。 それから、私は次のエラーを受け取りました: ``` The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\dev\*SolutionName*\*ProjectNamePrefix*.Data\bin\Debug\netcoreapp2.0\appsettings.json'. ``` ですから、基本的には、正しいルートパスを取得するための3つのオプションを試しました。 * `Directory.GetCurrentDirectory();` * `env.ContentRootPath;` ( `IHostingEnvironment`オブジェクト、ここで取得する方法が見つかりました: https : //github.com/aspnet/Home/issues/2194 ) * `AppDomain.CurrentDomain.BaseDirectory;` すべてが同じ`..\bin\debug\netcoreapp2.0\` pathを`..\bin\debug\netcoreapp2.0\` 。 VSからDataプロジェクトを実行すると、最初の2つのオプションが正しいプロジェクトのルートフォルダを指定します。 **正しいプロジェクトコンテンツのルートフォルダを取得する方法はありますか?** なぜなら、--verboseをEFコマンドに追加したとき、それは行をログアウトしたからです。 ``` Using content root 'C:\dev\FitsMeIdentity\FitsMeIdentity.Data\'. ``` だから、EFは何とかプロジェクトのルートを知っているが、上記のすべてのオプションは既にビルドされたアプリケーションのパスを返すことを理解している。 私が見つけた唯一の選択肢は、 `Copy output to root folder`に`Copy always` `Copy output to root folder`に変更`Copy output to root folder`です。ただし、ここからは見つかり`Copy always` : https : //www.benday.com/2017/02/17/ef-core-migrations-without-hard-コーディング-a-connection-string-using-idbcontextfactory /それは良い考えではない。 最初は、IOesionsをパラメータとして取得しても機能しないIDesignTimeDbContextFactory実装のコンストラクタを作成することを考えましたが、ここで説明したのと同じ問題がありました.Env Conn Stringを.NETコア2.0に挿入するEFコアDbContextスタートアップよりもクラスライブラリの実装と実装IDesignTimeDbContextFactory
回答: いいえ、あなたはこれをすることはできませんし、それ以上のことをすることはできません。あなたは*これをするべきで*はありません。 `IDesignTimeDbContextFactory`の全体的なポイントは、 `IDesignTimeDbContextFactory` ASP.NET Coreフレームワークが存在しないコンテキスト、つまりクラスライブラリから`DbContext`インスタンスを取得する方法です。 ASP.NETコアプロジェクトからマイグレーションを実行している場合は、それを必要とせず、そうでない場合は、設定のどれも利用できません。 さらに、それは*開発の*ためだけに使用されるため、その名前の「DesignTime」部分です。その結果、異なる環境の接続文字列を切り替えるようなものは必要ありません。接続文字列をドキュメントの詳細としてハードコードするだけです。