实体框架4 - AddObject与Attach我最近一直在使用Entity Framework 4,并且稍微混淆了何时使用ObjectSet.Attach和ObjectSet.AddObject。根据我的理解:当实体已存在于系统中时使用“附加”创建全新实体时使用“AddObject”所以,如果我正在创建一个新人,我会这样做。var ctx = new MyEntities();var newPerson = new Person { Name = "Joe Bloggs" };ctx.Persons.AddObject(newPerson);ctx.SaveChanges();如果我正在修改现有的人,我这样做:var ctx = new MyEntities();var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };existingPerson.Name = "Joe Briggs";ctx.SaveChanges();请记住,这是一个非常简单的例子。实际上我使用的是Pure POCO(无代码生成),Repository模式(不处理ctx.Persons)和Unit of Work(不处理ctx.SaveChanges)。但是“在幕后”,以上是我的实施中发生的事情。现在,我的问题 - 我还没有找到一个我不得不使用Attach的场景。我在这里失踪了什么?我们什么时候需要使用Attach?编辑只是为了澄清,我正在寻找何时使用Attach over AddObject(或反之亦然)的示例。编辑2下面的答案是正确的(我接受了),但我认为我会添加另一个例子,其中Attach将是有用的。在我上面修改现有Person的示例中,实际上正在执行两个查询。一个用于检索Person(.SingleOrDefault),另一个用于执行UPDATE(.SaveChanges)。如果(出于某种原因),我已经知道系统中存在“Joe Bloggs”,为什么还需要额外的查询才能获得他的第一个?我能做到这一点:var ctx = new MyEntities();var existingPerson = new Person { Name = "Joe Bloggs" };ctx.Persons.Attach(existingPerson);ctx.SaveChanges();这将导致只执行UPDATE语句。
3 回答
白衣染霜花
TA贡献1796条经验 获得超10个赞
这是一个迟到的回应,但它可能会帮助其他人找到这个。
基本上,当您操作“使用”范围之外的实体时,可能会发生“断开连接”的实体。
Employee e = null;
using (var ctx = new MyModelContainer())
{
e = ctx.Employees.SingleOrDefault(emp => emp .....);
}
using (var ctx2 = new MyModelContainer())
{
e; // This entity instance is disconnected from ctx2
}
如果您输入另一个“使用”范围,那么“e”变量将被断开,因为它属于之前的“使用”范围,并且由于先前的“使用”范围被破坏,因此“e”被断开。
这就是我理解它的方式。
- 3 回答
- 0 关注
- 356 浏览
添加回答
举报
0/150
提交
取消