DbContext.OnConfiguring(EF Core)で接続文字列を書きたくない時
つい先日のVS2017RCがアップデートされまして、.NET Coreのクラスライブラリを作成できるようになりました。
データベースだけをクラスライブラリにしたいなぁ… なんとふと考えたわけです。
テンプレートのWebApplication作ってもOnConfiguringメソッドに書かれる接続文字列は直接書くなよってワーニングが出たりしますし。
しかしながら-
ここに書かなきゃどこに書くんだよ!と色々調べたのですが、英語しかねぇ…(つらたん…)
Configuring a DbContext
https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
「Using IDbContextFactory」にある方法で解決します。
DbContextにはDependency Injectionで
SQLServerを使いますや接続文字列はこれですを設定したものが渡されるため、
DbContextOptionをコンストラクターの引数に追加します。
ただ、このままではMigrationをした時にDbContextOptionを渡す方法がないため、Migrationに失敗します。
どうやら、IDbContextFactoryを実装したクラスがあると良いらしい…
Migrationした時に実装したCreateメソッドの戻り値TContextをコンストラクターの引数に設定しているっぽいです。
プロジェクトに↑のファイルを含めると-
Migrationに成功しました。
ちなみに、NuGetパッケージはこんな感じです。
これをSugoiConsoleAppから使おうとすると、DIを自前でしないといけません。
DI っぽく EF Core 1.0 + SQLite を Full .NET と .NET Core のコンソールアプリケーションで使ってみる [Entity Framework Core]
http://aquasoftware.net/blog/?p=935
IServiceCollectionにサービスを登録して、ActivatorUtilities.CreateInstanceでインスタンスを生成するときに
IServiceProviderを渡すとDbContextOptionに設定されるっぽいです。
Microsoft.Extensions.DependencyInjectionが必要になります。
Update-Databaseできちんと反映することを確認しました。
通常はコードにも書かずにappsettings.jsonに書いて、それを読み込むんですけどね。
久しぶりに新しい技術とやらにチャレンジしてみました。
まだまだリリースされたばかりのもので、英語しかないのがつらたんですね。
ASP.NET Core MVCをやってみたいのですが、設計思想的なやーつが全然分かってないのかなぁ…と思っております。
とにかく、手を動かして分かっていきたいと思います。