かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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