實(shí)體框架4 - AddObject與Attach我最近一直在使用Entity Framework 4,并且稍微混淆了何時(shí)使用ObjectSet.Attach和ObjectSet.AddObject。根據(jù)我的理解:當(dāng)實(shí)體已存在于系統(tǒng)中時(shí)使用“附加”創(chuàng)建全新實(shí)體時(shí)使用“AddObject”所以,如果我正在創(chuàng)建一個(gè)新人,我會(huì)這樣做。var ctx = new MyEntities();var newPerson = new Person { Name = "Joe Bloggs" };ctx.Persons.AddObject(newPerson);ctx.SaveChanges();如果我正在修改現(xiàn)有的人,我這樣做:var ctx = new MyEntities();var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };existingPerson.Name = "Joe Briggs";ctx.SaveChanges();請記住,這是一個(gè)非常簡單的例子。實(shí)際上我使用的是Pure POCO(無代碼生成),Repository模式(不處理ctx.Persons)和Unit of Work(不處理ctx.SaveChanges)。但是“在幕后”,以上是我的實(shí)施中發(fā)生的事情?,F(xiàn)在,我的問題 - 我還沒有找到一個(gè)我不得不使用Attach的場景。我在這里失蹤了什么?我們什么時(shí)候需要使用Attach?編輯只是為了澄清,我正在尋找何時(shí)使用Attach over AddObject(或反之亦然)的示例。編輯2下面的答案是正確的(我接受了),但我認(rèn)為我會(huì)添加另一個(gè)例子,其中Attach將是有用的。在我上面修改現(xiàn)有Person的示例中,實(shí)際上正在執(zhí)行兩個(gè)查詢。一個(gè)用于檢索Person(.SingleOrDefault),另一個(gè)用于執(zhí)行UPDATE(.SaveChanges)。如果(出于某種原因),我已經(jīng)知道系統(tǒng)中存在“Joe Bloggs”,為什么還需要額外的查詢才能獲得他的第一個(gè)?我能做到這一點(diǎn):var ctx = new MyEntities();var existingPerson = new Person { Name = "Joe Bloggs" };ctx.Persons.Attach(existingPerson);ctx.SaveChanges();這將導(dǎo)致只執(zhí)行UPDATE語句。
3 回答

白衣染霜花
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
這是一個(gè)遲到的回應(yīng),但它可能會(huì)幫助其他人找到這個(gè)。
基本上,當(dāng)您操作“使用”范圍之外的實(shí)體時(shí),可能會(huì)發(fā)生“斷開連接”的實(shí)體。
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
}
如果您輸入另一個(gè)“使用”范圍,那么“e”變量將被斷開,因?yàn)樗鼘儆谥暗摹笆褂谩狈秶?,并且由于先前的“使用”范圍被破壞,因此“e”被斷開。
這就是我理解它的方式。
- 3 回答
- 0 關(guān)注
- 376 瀏覽
添加回答
舉報(bào)
0/150
提交
取消