2011-09-05 10 views
49

arasındaki heceleme DbSet.Create kullanmanız veya yeni bir varlık oluşturup eklememeniz konusunda biraz kafam karıştı. DbSet.Create kullanmanın sonuçlarını anlayamıyorum.DbSet.Create ve yeni Entity()

DbSet.Create öğesinin geçerliyse proxy yüklü bir sürüm oluşturacağını anlıyorum, ancak bunun ne demek olduğunu anlamıyorum. Neden umursayayım? Bana öyle geliyor ki, boş bir Proxied sınıfı, temsili yük ile ilgili hiçbir varlık olmadığı için, proxy olmayan bir sınıftan daha yararlı değildir.

Farkın ötesinde, açıklığın ötesinde bir şeyler söyleyebilir misiniz? Ve neden umurunda olursun?

cevap

51

DbSet<T>.Create() kullanımının mantıklı olduğu bir senaryo, var olan bir varlıkları bağlama ekler ve sonra ilgili varlıkların tembel yüklenmesinden yararlanır. Örnek:

public class Parent 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

şu sonra çalışacak: Çocukların

using (var context = new MyDbContext()) 
{ 
    var parent = context.Parents.Create(); 
    parent.Id = 1; // assuming it exists in the DB 
    context.Parents.Attach(parent); 

    foreach (var child in parent.Children) 
    { 
     var name = child.Name; 
     // ... 
    } 
} 

İşte geç yükleme (null belki boş koleksiyonu ile sonuçlanan değil) tetiklenir. new Parent() tarafından context.Parents.Create() değiştirilecekse, parent.Children her zaman null olduğundan foreach döngüsü çökecektir.

Düzenleme başka örnek buradaydı

(yeni bir varlığın bir yabancı anahtar özelliği doldurma ve sonra yeni taraf veritabanına eklenmiş olacaktır sonra tembel yüklenen navigasyon özelliğini alma): Lazy loading properties after an insert

+3

Ahh. Yabancı bir anahtar kimliğini daha yeni doldurabildiğini ve tembel olmasının, tüm yaygara olmadan yüklemesini sağlayamamıştım. Mevcut kaydı yüklemek istemiyorsanız ve sadece çocuğu istiyorsanız, bunun nasıl yararlı olabileceğini görebiliyorum. –

+0

"context.Parents" boşsa ne yapmalıyım? Durumunuzu deniyorum ve işe yarayabilir görünüyor ama maalesef benim için "context.Parents" null yani burada istisna türünde bir istisna oluşturur 'System.NullReferenceException 'YourProject.dll oluştu ama kullanıcı kodu ele değil Ek bilgi: Nesne başvurusu bir nesnenin örneğine ayarlanmadı. Herhangi bir çözümünüz varsa lütfen bize bildirin, bu yüzden üstesinden geleceğim ve notlarımda bir sonraki tekrardan kaçmak için notlarım olacak. –