現在、最新バージョンのEntity Frameworkを使用してプロジェクトに取り組んでいますが、解決できないと思われる問題が発生しました。
既存のオブジェクトの更新に関しては、別のクラスへの参照であるプロパティになるまで、オブジェクトのプロパティをかなり簡単に更新できます。
次の例では、さまざまなプロパティを格納するFooというクラスがあり、そのうちの2つは他のクラスのインスタンスです。
public class Foo
{
public int Id {get; set;}
public string Name {get; set;}
public SubFoo SubFoo {get; set}
public AnotherSubFoo AnotherSubFoo {get; set}
}
以下のEdit()
メソッドを使用すると、更新したいオブジェクトを渡して、Name
を適切に更新することができますが、SubFooのプロパティを変更する方法を見つけることができませんでした。たとえば、SubFoo
クラスにのプロパティがありName
、これが変更されており、私のDBとの間で異なる場合、クラスはnewFoo
更新されません。
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
var entry = context.Entry<Foo>(dbFoo);
entry.OriginalValues.SetValues(dbFoo);
entry.CurrentValues.SetValues(newFoo);
context.SaveChanges();
return newFoo;
}
ヘルプやポインタをいただければ幸いです。
更新:Slaumaのコメントに基づいて、メソッドを次のように変更しました
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
context.Entry(dbFoo).CurrentValues.SetValues(newFoo);
context.Entry(dbFoo.SubFoo).CurrentValues.SetValues(newFoo.SubFoo);
context.SaveChanges();
return newFoo;
}
これを今実行すると、次のエラーが発生します。
エンティティタイプCollection`1は、現在のコンテキストのモデルの一部ではありません。
newFoo
これを回避するために、サブクラスをコンテキストにアタッチしようとするコードを追加しましたが、これは、ObjectManager
すでに同じエンティティが存在するというエラーによるものです。
同じキーを持つオブジェクトは、ObjectStateManagerにすでに存在します。ObjectStateManagerは、同じキーを持つ複数のオブジェクトを追跡できません