只是出于我的好奇心(和未来的知识),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 将在数据库中创建一个新的 Parent,基本上是 currParent 的副本,然后将 currThing 的 Parent_ID 值设置为该副本。然后,如果我再做一次(例如,如果已经有两个父母),它不会创建一个新的父母,而是链接到第一个。我不太了解这种行为,但是在玩了一段时间之后,就像:
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?谢谢!