为了账号安全,请及时绑定邮箱和手机立即绑定

实体框架4 - AddObject与Attach

实体框架4 - AddObject与Attach

C#
开心每一天1111 2019-07-31 18:09:44
实体框架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”被断开。


这就是我理解它的方式。


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 356 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信