SORU
13 EKİM 2010, ÇARŞAMBA


Varlık Çerçevesi 4 - AddObject vs Ekle

Varlık ile Çerçeve 4 yakın zamanda çalışıyorum, ve biraz ** 8, ObjectSet.AddObject kullanma zamanı olarak karıştı.

Anlayış: benim

  • Kullanım "" bir Varlık ne zaman Sistemde mevcut Takın
  • Kullanım "" ne zaman yeni bir Varlık yaratmak . AddObject

Eğer anladıysamyeni bir İnsan yaratmakbu benim.

var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();

Eğer olursamvarolan bir Kişi değiştirmeben bunu yapmak için:

var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();

Unutmayın, bu birçok basitörnek. Gerçekte Saf POCO (hiçbir kod oluşturma), Havuz deseni (ile anlaşma yok ctx.kullanıyorum Kişi) ve Çalışma (ile anlaşma yok ctx.Birim SaveChanges). "Yorganın altında", yukarıda benim uygulamada ne olur. ama

Şimdi, benim sorum- Henüz kullanmak zorunda kaldığım bir senaryo bulmak için buradayımTakın.

Burada neyi kaçırıyorum? Ne zaman Takın kullanmaya gerek var mı?

EDİT

Sadece netleştirmek için, arıyorumörneklerAddObject üzerine Takmak (ya da tersi).

2 DÜZENLEYİN

Aşağıda cevabı doğru kabul ettim, ama Takmak yararlı olacağı başka bir örnek eklemek istedim.

Yukarıda verdiğim örnek içinvarolan bir Kişi değiştirmeiki sorgu aslında idam ediliyor.

Bir Kişi almak için.SingleOrDefault), ve başka bir GÜNCELLEŞTİRME gerçekleştirmek için.SaveChanges).

(Bazı nedenlerden dolayı), zaten "Joe Bloggs" sistem neden önce onu almak için ekstra bir sorgu? içinde var olduğunu biliyordu Bunu yapabilirim:

var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();

Bu sadece bir UPDATE deyimi neden olur.

CEVAP
13 EKİM 2010, ÇARŞAMBA


ObjectContext.AddObjectObjectSet.AddObject:
AddObjectyöntem bu yeni oluşturulan nesneler eklemek içindeğilveritabanında yok. Varlık otomatik olarak oluşturulan geçici olacaktırEntityKeyve onun EntityState ayarlanırEklendi. SaveChanges çağrıldığında, bu varlık veritabanına eklenmesi gereken EF açık olacak.

ObjectContext.Attachve ObjectSet.Attach:
Öte yandanTakınvarlıkları zaten . için kullanılır ^strong>varveritabanında. Ayarı yerine Bir Eklendi, Eklemek sonuçlarına EntityStateDeğişmedenİçeriğe bağlı olduğuna göre değişmediği anlamına gelir EntityState,. Ekleme nesneleri veritabanında mevcut kabul edilir. Eğer değiştirmek nesneleri sonra geldiler bağlı, ne zaman Ara SaveChanges değeri EntityKey için kullanılır güncelleme (veya silmek) uygun satır bulma eşleşen kendi KİMLİĞİ db tablo.

Ayrıca, bu yöntemi kullanarak Takın, zaten ObjectContext mevcut varlıklar arasındaki ilişkileri tanımlayabilirsiniz amadeğilotomatik olarak bağlanmış Temel olarak Ekle ana amacı, zaten ObjectContext bağlı ve varlıklar bağlamaktırdeğilkullanamazsınız böylece yeni Eklenmiş olan varlıklar eklemek için Ekle. Kullanmak zorunda() Ekleyinbu durumda.

Örneğin, diyelim ki Kişi senin varlığın bir gezinti özelliği adlı varsayalımAdresleritopluluğudurAdresvarlık. Hadi bağlamında iki Nesne okudum ki, ama birbiriyle alakalı değil ve bunu yapmak istiyorum:

var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
var myAddress = ctx.Addresses.First(a => a.PersonID != existingPerson.PersonID);
existingPerson.Addresses.Attach(myAddress);
// OR:
myAddress.PersonReference.Attach(existingPerson)
ctx.SaveChanges();

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • esnathesinger

    esnathesinge

    6 NİSAN 2009
  • sebsebdouze

    sebsebdouze

    7 ŞUBAT 2008
  • SHAYTARDS

    SHAYTARDS

    1 EKİM 2008