2010-07-06 16 views
10

İki sınıfım var:NHibernate: "koleksiyon tembel yükleme sorunu nedeniyle flush() tarafından işlenmedi

class Parent 
{ 
    public virtual Child Child { get; set; } 
} 

class Child 
{ 
    public virtual IList<GrandChild> GrandChildren { get; set; } 
} 

ISession'ımdan yüklenen bir Parent örneğim var, Parent.Child tembel yüklü (bu noktada yüklü DEĞİLDİR). Child.GrandChildren da tembel yüklüdür.

Bunu yapmam gerekirse:

session.Save(new Parent { Child = existingParent.Child }); 

existingParent

olsun existingParentChild özelliği yüklenmesine neden oluyorsa, sadece ona erişerek:

var x = existingParent.Child.Name 

sorun gider uzakta. Bu neden oluyor ve bunu nasıl karşılarım - tercihen alma stratejimi değiştirmek zorunda kalmadan - nasıl çözerim?

** Düzenleme: ** Ebeveyn bir Çocuk için

kullanıyorum NH 2.1.2.4000

kullanıyorum

Teşekkürler

+0

Koleksiyona dokunmayı içermeyen bir düzeltme buldunuz mu? – bcsanches

+0

dont düşünün :( –

+0

"bir belge kullanın db, bunun yerine" sayıyor –

cevap

0

Çocuk dan torununa basamaklı değişiklikler için kaskad ayarı nedir Child bir FK vardır Toplamak? NHibernate, koleksiyon kirliyse, cascade ayarı değişikliklerin kalıcı olmasına neden olmazsa bu istisnayı atar.

+0

ive herhangi bir değişiklik yapılmadı yüzden neden bu yüzden yüklü değil? Ben sadece yeni bir 'ebeveyn 'yapmak istiyorum, mevcut bir ebeveyn ile aynı çocuk ile. saveupdate 've hasmany için alldeleteorphan' –

+0

Çocuk kurucusunda GrandChildren koleksiyonunu başlatıyor musunuz? Lütfen eşleştirmeleri gösterin. –

0

db'ye bir yolculuk yapmadan mevcut bir Child örneğine başvurmak için session.Load'u kullanabilirsiniz. Bu yapmalıyım, ben düşünüyorum:

session.Save(new Parent { Child = session.Load(existingParent.Child.Id) }); 

Ama .Id çağrısı bir db gezi tetiklemez emin olmak için kontrol edin.

1

Benzer bir sorun yaşadım, @Jamie Ide'den gelen yorum, sorunun ne olduğunu anlamama yardımcı oldu. Koleksiyonu, koleksiyonun içinde, NHibernate'in koleksiyonun kirli olduğunu düşünmesine neden oluyordu.

Elde ettiğim istisna: ClassName: ERROR | NHibernate.AssertionFailure: collection [CollectionName], flush()

tarafından işlenmedi. Yine de bu başlatmayı yapmak istiyorum, ancak bu soruna başka bir çözüm bulmam gerekiyor.

İlgili konular