我最近一直在使用Entity Framework 4,并且稍微混淆了何时使用ObjectSet.Attach和ObjectSet.AddObject.
根据我的理解:
所以,如果我正在创建一个新人,我会这样做.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
如果我正在修改现有的人,我这样做:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
请记住,这是一个非常简单的例子.实际上我使用的是Pure POCO(无代码生成),Repository模式(不处理ctx.Persons)和Unit of Work(不处理ctx.SaveChanges).但是"在幕后",以上是我的实施中发生的事情.
现在,我的问题 - 我还没有找到一个我不得不使用Attach的场景.
我在这里失踪了什么?我们什么时候需要使用Attach?
编辑
只是为了澄清,我正在寻找何时使用Attach over AddObject(或反之亦然)的示例.
编辑2
下面的答案是正确的(我接受了),但我认为我会添加另一个例子,其中Attach将是有用的.
在我上面修改现有Person的示例中,实际上正在执行两个查询.
一个用于检索Person(.SingleOrDefault),另一个用于执行UPDATE(.SaveChanges).
如果(出于某种原因),我已经知道系统中存在"Joe Bloggs",为什么还需要额外的查询才能获得他的第一个?我能做到这一点: …
我一直在寻找这方面的信息无济于事.我需要这个的背景是我在这里问的另一个问题.更具体地说,在App_Data中创建/更新/删除文件会导致池回收吗?
如果有人能提供导致回收的详细清单,那就太好了.
更新:由于两个用户已经注意到我也很乐意回答指定仅回收AppDomain而不是整个池的原因.