一旦DBからとってきたデータを暫く手元に置いておいて、後で更新したいということってありますよね。Entity Frameworkのデフォルトの挙動だと、DbSetから取得したデータに対する変更は監視して、いい感じにSaveChangesのときにDBに反映してくれます。
ただ、別のDbContextから取得したオブジェクトや手元でnewしたオブジェクトは、そのままではいい感じに変更監視してくれません。 そんな時に使えるのがDbSetのAttachメソッドです。Attachにオブジェクトを渡すと変更監視してくれます。 また、Attachの戻り値のEntityEntryのStateをEntityState.Modifiedにすることで、変更があったとマークすることが出来ます。
コードで書くと以下のような感じです。
var p = default(Person); using (var ctx = new SampleContext()) { p = new Person { Name = "Tanaka" }; ctx.People.Add(p); ctx.SaveChanges(); } p.Name = "Kimura"; using (var ctx = new SampleContext()) { var tracker = ctx.People.Attach(p); tracker.State = Microsoft.Data.Entity.EntityState.Modified; ctx.SaveChanges(); } using (var ctx = new SampleContext()) { p = ctx.People.First(); Debug.WriteLine($"{p.Id} {p.Name}"); ctx.SaveChanges(); }