我最近一直在使用Entity Framework 4,对于何时使用ObjectSet.Attach和ObjectSet.AddObject感到有些困惑。
据我了解:
- 当系统中已经存在实体时,使用“附加”
- 创建全新的实体时使用“ AddObject”
因此,如果我要创建一个新的Person,则可以执行此操作。
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();
请记住,这是一个非常简单的示例。实际上,我使用的是Pure POCO(不生成代码),存储库模式(不处理ctx.Persons)和工作单元(不处理ctx.SaveChanges)。但是,“在幕后”,以上就是我的实现过程。
现在,我的问题 -我还没有找到必须使用Attach的情况。
我在这里想念什么?我们什么时候需要使用Attach?
编辑
只是为了澄清,我正在寻找何时使用AddObject上的Attach的示例(反之亦然)。
编辑2
下面的答案是正确的(我接受了),但是我想添加另一个示例,其中“附加”将很有用。
在我上面的用于修改现有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语句。