Geçenlerde İdare Framework 4 ile çalışıyor olması ve biraz ne zaman kullanılacağını olarak karıştı ObjectSet.Attach ve ObjectSet.AddObject .
Anladığım kadarıyla:
- Sistemde zaten bir Varlık varsa "Ekle" yi kullanın
- Yepyeni bir Varlık oluştururken "AddObject" kullanın
Yani, yeni bir Kişi oluşturuyorsam , bunu yaparım.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
İ olursam varolan Kişi değiştirerek , bunu yapmak:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Unutmayın, bu çok basit bir örnek. Gerçekte, Pure POCO'lar (kod üretme yok), Depo kalıbı (ctx.Persons ile uğraşmayın) ve İş Birimi (ctx.SaveChanges ile uğraşmayın) kullanıyorum. Ancak "örtülerin altında", benim uygulamamda yukarıdakiler oluyor.
Şimdi sorum - Attach'ı kullanmak zorunda olduğum bir senaryoyu henüz bulamadım .
Burada neyi özlüyorum? Attach'ı ne zaman kullanmamız gerekir?
DÜZENLE
Sadece açıklığa kavuşturmak için, AddObject üzerinden Attach (veya tam tersi) ne zaman kullanılacağına dair örnekler arıyorum .
DÜZENLEME 2
Aşağıdaki cevap doğrudur (kabul ettim), ancak Ekle'nin yararlı olacağı başka bir örnek ekleyeceğimi düşündüm.
Mevcut bir Kişiyi değiştirmek için yukarıdaki örneğimde, aslında iki sorgu yürütülüyor.
Kişi (.SingleOrDefault) almak ve diğeri GÜNCELLEME (.SaveChanges) gerçekleştirmek için.
Eğer (herhangi bir nedenle), sistemde "Joe Bloggs" un var olduğunu zaten biliyorsam, neden önce onu almak için fazladan bir sorgu yapayım? Bunu yapabilirim:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Bu, yalnızca bir UPDATE deyiminin yürütülmesine neden olur.