EntityFramework Core 2.0のScaffoldで生成されるコードをカスタマイズする

長らく業務アプリ開発洗脳鍛えられた開発者は未だにコードファーストに馴染めない
と思うのは気のせいでしょーか??(´・ω・`)

というわけで、DBファースト(DB設計してから)コードを書く場合、
一から書いてもいいが大して利用頻度が高くないようなマスタメンテなんかはやってられないので
Ruby On Railsでも有名なScaffoldがASP.NET Coreでもできるので楽をしようという話(が本題ではないw)

パッケージマネージャーコンソールの場合はScaffold-DbContext
コマンドラインだとdotnet ef dbcontext scaffold
でDBからMVCのMができる

次にコマンドラインdotnet aspnet-codegeneratorを叩くと
MVCのV、Cができあがる
※こちらはパッケージマネージャーコンソール版は無い(理由は知らない)

VIEWは一律で

  • Create
  • Delete
  • Details
  • Edit
  • Index

ができあがる
内容は名前から想像できるので省略

生成されたVIEWの中のコードは当然?日本語など一切なく

<label asp-for="MailAddress" class="control-label"></label>
<input asp-for="MailAddress" class="form-control" />

こんなコードが生成される
Index以外のVIEWは上のようなlabel+inputが基本の模様

このまま実行してブラウザに表示させてもラベルは英語の「MailAddress」にしかならない
自分だけが操作するなら英語のままでもいいかもしれないが
他人が使うのであればやはり日本語で「メールアドレス」と出てほしいと思うのが人情というもの

そこで生成したModelのプロパティに旧来のASP.NET MVCでもやっていたDisplay属性をつけることで日本語を出力できる

今回の例だと[Display(Name = "メールアドレス")]

しかしこれを手で追加するのは煩わしいことこの上ない

怠惰な開発者であれば自動化したいところ


そこでICSharpEntityTypeGeneratorなどを実装することで自動化ができる

と言っても実際はCSharpEntityTypeGeneratorという実装クラスがあるのでそこからコピペしていじくるだけの簡単なお仕事

githubにSqlServer用のサンプルを上げたので参考になればと…

上記サンプルの CommentHelper 内の ConnectionString を編集してScaffoldすればDisplay属性付きのModelが生成されるはず

※複数プロジェクトがある場合はスタートアッププロジェクトにしておかないとMyDesignTimeServicesが呼ばれないという落とし穴があるのでご注意を