ブログ

DbContext.OnConfiguring(EF Core)で接続文字列を書きたくない時

2017年2月1日 12:00 | ブログ | | 880 views

このエントリーをはてなブックマークに追加
はてなブックマーク - DbContext.OnConfiguring(EF Core)で接続文字列を書きたくない時
reddit にシェア
Pocket
LINEで送る

つい先日のVS2017RCがアップデートされまして、.NET Coreのクラスライブラリを作成できるようになりました。
データベースだけをクラスライブラリにしたいなぁ… なんとふと考えたわけです。
テンプレートのWebApplication作ってもOnConfiguringメソッドに書かれる接続文字列は直接書くなよってワーニングが出たりしますし。

SugoiDbContext.cs(その1)

SugoiDbContext.cs(その1)

しかしながら-
ここに書かなきゃどこに書くんだよ!と色々調べたのですが、英語しかねぇ…(つらたん…)

Configuring a DbContext
https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

「Using IDbContextFactory」にある方法で解決します。

SugoiDbContext.cs(その2)

SugoiDbContext.cs(その2)

DbContextにはDependency Injection
SQLServerを使いますや接続文字列はこれですを設定したものが渡されるため、
DbContextOptionをコンストラクターの引数に追加します。

Migration失敗

Migration失敗

ただ、このままではMigrationをした時にDbContextOptionを渡す方法がないため、Migrationに失敗します。

どうやら、IDbContextFactoryを実装したクラスがあると良いらしい…
Migrationした時に実装したCreateメソッドの戻り値TContextをコンストラクターの引数に設定しているっぽいです。

SugoiDbContextFactory.cs

SugoiDbContextFactory.cs

プロジェクトに↑のファイルを含めると-

Migration成功

Migration成功

Migrationに成功しました。

SugoiDatabase(NuGetパッケージ)

SugoiDatabase(NuGetパッケージ)

ちなみに、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に設定されるっぽいです。

Program.cs

Program.cs


SugoiConsoleApplication(NuGetパッケージ)

SugoiConsoleApplication(NuGetパッケージ)

Microsoft.Extensions.DependencyInjectionが必要になります。

データベース反映

データベース反映

Update-Databaseできちんと反映することを確認しました。
通常はコードにも書かずにappsettings.jsonに書いて、それを読み込むんですけどね。

久しぶりに新しい技術とやらにチャレンジしてみました。
まだまだリリースされたばかりのもので、英語しかないのがつらたんですね。

ASP.NET Core MVCをやってみたいのですが、設計思想的なやーつが全然分かってないのかなぁ…と思っております。
とにかく、手を動かして分かっていきたいと思います。