LoginSignup
2
0

More than 3 years have passed since last update.

Entity Framework で Procedure をコールしても、デフォルトの追跡状態だと再取得した値が変わらないよ

Posted at

追跡と追跡なしのクエリ - 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 に記載されています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0