追跡と追跡なしのクエリ - EF Core | Microsoft Docs
一度値を取得してから Procedure で値を更新して、再度値を取得しても変わらなかったことがありませんか?
原因は EF の追跡機能なので、対策方法は公式に書いてあるとおり AsNoTracking
を使うか QueryTrackingBehavior.NoTracking
を使いましょう。 EF Core だけでなく .NET Framework の Entity Framework も同じ動きです。
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.AsNoTracking()
.ToList();
}
using (var context = new BloggingContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var blogs = context.Blogs.ToList();
}
ちなみに FromSql や ExecuteSqlCommand で Procedure をコール EXECUTE xxxProc @params
した場合以外にも、生 SQL クエリ (UPDATE xxxTable SET xxxColmun = @value
) で Update した場合も追跡を解除しないと (たぶん) ダメです。
EF を使う場合はテストコードを書くときくらいしか 生 SQL クエリでデータを追加更新をしないと思うのですが、念の為補足です。
生 SQL の扱いは 生 SQL クエリ - EF Core | Microsoft Docs に記載されています。