【发布时间】:2011-04-24 14:56:14
【问题描述】:
我最近一直在使用 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();
如果我要修改现有的 Person,我会这样做:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
请记住,这是一个非常简单的示例。实际上,我使用的是纯 POCO(无代码生成)、存储库模式(不处理 ctx.Persons)和工作单元(不处理 ctx.SaveChanges)。但是“在幕后”,以上是我的实现中发生的事情。
现在,我的问题 - 我还没有找到我必须使用 Attach 的场景。
我在这里缺少什么?我们什么时候需要使用 Attach?
编辑
澄清一下,我正在寻找何时使用 Attach over AddObject(反之亦然)的示例。
编辑 2
下面的答案是正确的(我接受了),但我想我会添加另一个 Attach 有用的例子。
在上述修改现有人员的示例中,实际上执行了两个查询。
一个用于检索 Person (.SingleOrDefault),另一个用于执行 UPDATE (.SaveChanges)。
如果(出于某种原因),我已经知道系统中存在“Joe Bloggs”,为什么还要额外查询以先获取他?我可以这样做:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
这将导致只执行一条 UPDATE 语句。
【问题讨论】:
-
Attach 也用于 MVC 现在将模型直接放回 EF 的日子。效果很好,节省了大量的代码行。
标签: c# .net entity-framework-4 crud