2010-10-01 17 views
5

İlgili varlık koleksiyonunu yenilemede sorun yaşıyorum.Varlık Çerçevesi POCO - Bir gezinme özelliğini yenileyin

Esasen sorun şöyledir:

public class Student 
{ 
    public virtual ICollection<Lecture> Lectures { get; set; } 

    public void AddLecture(Lecture lecture) 
    { 
     Lectures.Add(lecture); 
    } 

    public void CancelChanges() 
    { 
     _context.Refresh(RefreshMode.StoreWins, this); 
     _context.LoadProperty(this, (o) => o.Lectures, 
      MergeOption.OverwriteChanges); 
    } 
} 

public class Grade 
{ 
    public virtual Student { get; set; } 
} 

Şimdi biz düzenleme işlemini iptal edebilirsiniz istiyorsam, dersler eklemek için bazı GUI ve: Yani

public void ExampleEdit() 
{ 
    Student student = _context.Students.SingleOrDefault(/* blah */); 
    student.AddLecture(_context.Lectures.SingleOrDefault(/* e.g. math */)); 
    student.CancelChanges(); 
    // At this point student SHOULD have no lectures anymore since the 
    // property was loaded with overwrite changes option. 
    // Yet the Lectures still contains the lecture we added there 
} 

, kodudur kötü? Yanlış kullandığım bir yöntem var mı? Tüm nesneyi TAMAMEN yeniden yüklemek mümkün mü? ..

cevap

7

MergeOption.OverwriteChanges yanlış anlaşıldığını düşünüyorum. Varsayılan olarak, her zaman ObjectContext bir sorgu gerçekleştirir, varsa, bu nesnelerin önceden döndürülmüş kopyaları, önbelleğinde zaten varsa, yok sayılır.

Tüm bunların, EntityKeys temel alınarak gerçekleştirildiğini unutmayın. Temelde nesnelerin EntityKeys kontrol edilir bir sorgudan döndürülen ve aynı EntityKey sahip bir nesne (aynı EntitySet içinde senin olayda, Dersler) zaten önbellekte varsa, varolan nesne bırakılır bakir. Eğer OverwriteChanges etkinleştirirseniz

Ancak, o zaman bellek varlık düzenlenmiş olsa bile, veritabanından gelen değerleri mevcut varlıkların akım değerleri değiştirme olacaktır.

Eğer Öğrenci tamamen yenidir öğrenciye Anlatım ekliyoruz ve EntityKey sizin LoadProperty() çağrı uyarınca veritabanından gelen olanlardan daha farklıdır çünkü üzerine yazılmaz görebileceğiniz gibi.

bir çözüm sadece LoadProperty() önce öğrenci nesneden sadece basitçe net tüm Kuram olacaktır:

public void CancelChanges() { 
    _context.Refresh(RefreshMode.StoreWins, this); 
    this.Lectures.Clear(); 
    _context.LoadProperty(this, (o) => o.Lectures, MergeOption.OverwriteChanges); 
} 
+0

teşekkürler açıklama için çok - bu şeylerin çok daha net bir sürü yaptı kafamın içinde. Ve önerdiğiniz çözüm çok kullanışlıdır - Kodumu yeni güncelledim ve aslında işe yarar. – Jefim

+0

Çok hoş geldiniz, yardım ettiğine sevindim :) –

İlgili konular