EntityFramework CoreでSELECTせずにUPDATEを行う
O/Rマッパーでデータの更新を行う場合は、
- オブジェクトを取得して
- プロパティを変更して
- 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マッパーなんぞ使うんだ…というのはさておきですけどね。