私の好奇心(および将来の知識)のために、Entity Framework 5は、既存のオブジェクトを参照するのではなく、新しいオブジェクトを作成するタイミングをどのように決定しますか?私はちょうど何か間違ったことをしているかもしれませんが、私が次の線に沿って何かをする場合は時々そうです:
using (TestDB db = new TestDB())
{
var currParent = db.Parents.Where(p => p.Prop == passedProp).FirstOrDefault();
if(currParent == null) {
Parent newParent = new Parent();
newParent.Prop = passedProp;
currParent = newParent;
}
//maybe do something to currParent here
var currThing = db.Things.Where(t => t.Prop == passedPropTwo).FirstOrDefault();
currThing.Parent = currParent;
db.SaveChanges();
}
EFは、データベースに新しい親(基本的にはcurrParentのコピー)を作成し、currThingのParent_ID値をそのコピーに設定します。次に、もう一度実行すると(たとえば、それらの親がすでに2つある場合)、新しい親は作成されず、代わりに最初の親にリンクされます。私はこの振る舞いを本当に理解していませんが、しばらくそれをいじった後、次のようなものがあります。
using (TestDB db = new TestDB())
{
var currParent = db.Parents.Where(p => p.Prop == passedProp).FirstOrDefault();
if(currParent == null) {
Parent newParent = new Parent();
newParent.Prop = passedProp;
currParent = newParent;
}
//maybe do something to currParent here
var currThing = db.Things.Where(t => t.Prop == passedPropTwo).FirstOrDefault();
currThing.Parent = db.Parents.Where(p => p.ID == currParent.ID).First();
db.SaveChanges();
}
問題を解決したようです。私が知っておくべきこれが起こるかもしれない理由はありますか、それとも私がその時それをしていた方法について何か奇妙なことがありましたか?申し訳ありませんが、正確なコードについて詳しく説明することはできません。しばらく前にこれに遭遇し、上記のコードで修正したため、質問する理由がわかりませんでした。より一般的には、EFは、新しいアイテムを作成するのではなく、既存のアイテムを参照するかどうかをどのように決定しますか?IDが設定されているかどうかだけに基づいていますか?ありがとう!