スポンサーリンク
スポンサーリンク

EF Core 5.0 は追跡機能が有効になっていると、DB上の変更がDbSetに反映されない

.NET CoreASP.NET CoreC#EF CoreSQL Serverデータベース

「Asp.Net Core 5.0 + EF Core 5.0 + SQLServer 2019」環境で開発していて、 EF Core 5.0 の FromSqlRaw()でストアドプロシージャからDbSet<> に一覧データを取得したあと、ExecuteSqlRaw()からストアドプロシージャで一覧データを更新し、
その後、FromSqlRaw()でストアドプロシージャからDbSet<> に一覧データを取得し直すと、更新したデータが反映されてなくハマった。

EF Core 5.0 はデフォルトで、エンティティの追跡機能が有効になっていて、 エンティティに対する変更をSaveChanges()でデータベースへ反映する実装にしていないのが原因だったが、追跡機能を無効にする方法もある。

ApplicationDbContext.cs に「ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking」を加え、EF Core 5.0 の追跡機能を無効にすることで解消した。

SQLを全てストアドプロシージャで実装している環境では、EF Core 5.0 の追跡機能を有効にするメリットは何も無いので、無効にしておいた方が良い。

追跡機能を無効にすると、EF Core 5.0 のパフォーマンスが改善する。
当初、Dapperとパフォーマンスを比較し、Dapperの方が明らかにパフォーマンスが良かったが、 EF Core 5.0 の追跡機能を無効にした結果、パフォーマンスの差も解消した。

 

更新処理。
「Asp.Net Core 5.0 + EF Core 5.0」からストアドプロシージャを通してSQLServer 2019 上のデータを更新している。

 

検索処理、

 

コメント

タイトルとURLをコピーしました