しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Core / Entity Framework Core 3.0 の気になった機能と 2.2 からの移行

.NET Conf 2019 で予定通り .NET Core 3.0 が GA しました。同時に ASP.NET Core 3.0 と Entity Framework Core 3.0 もこれまで通りリリースされています。

2.0 の時と同じように 3.0 は LTS ではないので注意が必要です。11 月にリリースが予定されている 3.1 が LTS になるはずなので、アップデートの心構えは必要でしょう。

とりあえず新機能とかの紹介は公式ブログに目を通しておけば大体 OK です。.NET Core 3.0 はプレビューリリースが多かったので、多少大雑把に書かれている部分もあります。

.NET Conf 2019 の Keynote についてはぶちぞう RD が既にまとめているので、読んでおくと良いです。

新機能が非常に多いですが、.NET Core 3.0 とか C# 8.0 に関しては ufcpp にぃにが書いてくれるはずなので触れません。いつも通り興味のある部分だけ摘まんで書きます。

ASP.NET Core 3.0

アップデートは多そうに見えますが、大体は Blazor なので坂本さんに任せます。SignalR も ASP.NET Core ファミリーの中では新しめなので、3.0 でのアップデートは多めです。

それ以外の部分は割と小粒なアップデートです。互換性に影響する部分は Endpoint Routing への全面的な移行と System.Text.Json がデフォルトになった点ぐらいです。

気になったアップデートは大体以下のような感じです。Breaking Changes ということで古い API をガシガシ削除しているので、古いコードはコンパイルが通らない可能性があります。

JSON シリアライザが変わった結果、JSON.NET の属性を使っていた部分は例外なく死ぬので、JSON.NET に戻すか System.Text.Json 向けに属性を修正するかの作業が必要です。

Endpoint Routing は 2.2 でも有効にされていましたが、3.0 ではそもそもパイプラインでの書き方が変わっているので、そこを修正する必要があります。挙動もこれまでのルーティングとは異なるので、Endpoint Routing 周りは割と注意したい部分です。

2.2 の時のように Endpoint Routing をオフに出来ますが、パフォーマンスや一貫性のある挙動を得るためにも移行した方が良いです。

これ以外にパフォーマンスに関係しそうなものとして Kestrel の Unix Domain Socket サポートがありますが、元々対応していたはずなので libuv から SocketsHttpHandler に切り替えた時に吹っ飛んだのかも知れません。

App Service にはデプロイ中らしいので、Framework Dependent としてデプロイ出来るようになるまで少しかかりそうです。Tiered Compilation と ReadyToRun には割と期待しています。

少なくとも 2.2 の時のように GA 直前で Opt-in に戻されることはなかったので、.NET Core 3.0 ではデフォルトで Tiered Compilation と QuickJit は有効になっているはずです。

Entity Framework Core 3.0

LINQ 周りを全面的に書き換えた結果、色々と良くなったようです。これまでは Remotion.Linq を使っていましたが、それを完全に自前のコードで置き換えたようです。

関係なさそうですが Breaking Changes はそれなりの数になっているので注意したいです。

新機能は LINQ 周りの書き換えに全力投球したからか、思ったより多くはないです。C# 8.0 の NRT サポートと Interception API は結構良さそうです。

  • LINQ でクライアントサイド実行をしないように
    • 何故か勝手に SQL に変換できない処理をクライアントで行うようになっていた
  • C# 8.0 サポート
    • Null Reference Type は SQL との相性が良さそう
    • Async Stream は SQL がどのように生成されて実行されるのか気になる
  • Interception API
    • 低レベル処理の直前にいろいろと割り込み出来る

LINQ で書いたクエリが SQL 変換できない場合に、勝手にクライアントサイドで実行するという最悪な挙動が戻されたのは良いです。これ以外に Cosmos DB サポートがありますが、Cosmos DB SDK v3 の出来が良いのでわざわざ RDB の感覚で触る必要はないでしょう。

2.2 から 3.0 への移行

ASP.NET Core 3.0 は Hosting 周りで Breaking Changes が入っているので、これまでに比べて多少は移行が面倒になっています。とはいえ基本はドキュメントに従って行えば大丈夫です。

IHostBuilderStartup の変更はパッと見分かりにくそうですが、3.0 のテンプレートからコピペでも問題ないレベルです。JSON.NET の参照が無くなっている部分の方が大変です。

一時的に JSON.NET の参照を追加して以前の動作に戻すのも手ですが、長期的に考えると System.Text.Json への移行を行っておいた方が良いです。

小さいアプリですが、以前に ASP.NET Core 2.2 から 3.0 への移行を行ったので、参考までに PR を載せておきます。JSON.NET の属性に依存していたので少し手間でした。

ASP.NET MVC 1 から導入されたルーティング周りのアーキテクチャが Endpoint Routing でシンプルで一貫性のあるものになりましたが、考え方になれるまでに少し時間が掛かりそうな気がします。

HTTP パイプラインの再設計とも言えるので、思想を理解できればすんなり入ってくるはずです。