かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

UWPでEntity Framework 管理外のオブジェクトを変更監視に追加する

一旦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();
}