EntityFramework CoreでSELECTせずにUPDATEを行う

O/Rマッパーでデータの更新を行う場合は、

  1. オブジェクトを取得して
  2. プロパティを変更して
  3. SaveChanges()を行う

というのが普通です。

using(var context = new BlogDbContext())
{
    var blog = context.Blog.Find(1);
    blog.Title = "まだ〇〇で消耗しているの?";
    await context.SaveChangesAsync();
}

取得も更新もしているので、もちろんSELECT文とUPDATE文が飛びます。

SQLだとPKと変更したい値がわかってるならSELECT無しでUPDATEできるじゃん!無駄!」という気持ちになりますよね。なりませんか。O/Rマッパーは値の変更を追跡しているので、ChangeTrackerに変更を伝える事さえできれば、SELECTは要りません。EntityFrameworkでは、DbContext.Entryメソッドで取得した諸々からChangeTrackerとやり取りをできます。

using(var context = new BlogDbContext())
{
    var blog = new Blog
    {
        Id = 1,
        Title = "まだ〇〇で消耗しているの?",
    };
    context.Entry(blog).Property(nameof(Blog.Title)).IsModified = true;
    await context.SaveChangesAsync();
}

このレベルのチューニングをすべきアプリでそもそもなんでO/Rマッパーなんぞ使うんだ…というのはさておきですけどね。