2012-08-01 24 views
7

Koleksiyonum yüklenirken bir sorunum var. Kurduğum Kur, FluentNHibernate kullanılarak eşlenen basit bire çok ilişkidir. Varlık, istisna atılmış olsa da yüklenir, ancak ilgili koleksiyona erişim "yükleme toplama yasa dışı erişim" görüntüler. Kodun ilgili kısmını burada yapıştırırım. Ayrıca çizgi hariç tutarak ve .Not.LazyLoad() arayarak, tembel yüklenmesini devre dışı denedimNHibernate collection loading, "yükleme koleksiyonuna yasa dışı erişim"

public DepartmentMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name) 
     .Not.Nullable() 
     .Length(100); 
    HasMany(x => x.PressJobRun) 
     .AsBag() 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .LazyLoad() 
     .BatchSize(50); 
    ... 
} 

şöyle

[Serializable] 
[DataContract(IsReference = true)] 
public partial class Department : Entity 
{ 
    ... 
    [DataMember] 
    public virtual IList<PressJobRun> PressJobRun 
    { 
     get { return pressJobRunField; } 
     protected set { pressJobRunField = value; } 
    } 
    ... 
} 

ancak aynı sona, eşleştirilmiş. Ben Oturumu açığa fark ettin

using (var tx = m_Repository.Session.BeginTransaction()) 
    { 
     var depts = m_Repository.Session.CreateCriteria<Department>().List<Department>(); 
     var dept = depts[0]; 
     ... 
    } 

yapılacak şey değil, ama bu oturumun açık olduğundan emin olmak için girişimlerde oldu. Ben yığın izlemesi aşağıdaki bkz istisna detaya

:

at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing) 
    at NHibernate.Collection.AbstractPersistentCollection.Read() 
    at NHibernate.Collection.AbstractPersistentCollection.ReadSize() 
    at NHibernate.Collection.PersistentBag.get_Count() 
    at NHibernate.DebugHelpers.CollectionProxy`1.get_Items() 

ilginç gremlin buraya gelir. PressJobRun özelliğinin ayarlayıcı satırında kesme noktası belirledim. Bunun ve hızlı seyretmek pressJobRunField üzerinde çıkarsam

  • , ben "yükleme istisna-yasadışı erişim" bölümüne bakın.
  • value değişkenini ilk hızlıca izlediğimde yüklü koleksiyonu görüyorum. Setter hattı üzerinden adım atma beklendiği gibi çalışır.

Ben

  • Visual Studio 2012, hedefleme .NET 4
  • NHibernate 3.3.1.400
  • SQL CE 4
  • Kale
  • Kale AutoTx facitlity
  • kullanmak ne
  • Oturum p'yi yönetiyorum er WCF kendim

denedim ne

  • o oturumun açık olduğunu ve kusurlu kod yürütülürken aynı oturum olduğundan emin yapılmış tembel yükleme
  • devre dışı bırakma isteğinde
  • toplanan Inverted koleksiyon haritası (tersine çevrilmesi gerektiğine inanıyorum)
  • temizlenmiş ve yeniden oluşturulmuş çözüm
  • Yapılandırma Yöneticisi'nde, çözümdeki tüm projelerin
  • tüm atılan istisnaları kırmak için hata ayıklayıcısını oluşturulduğundan emin olun.Debugger i

cevap

3

Sorun PressJobRub.Department özelliği ayarlandığında, benim kodu da Department uygun koleksiyonuna PressJobRun ekler olmasıdır koleksiyonunda ayarlama sayfa hariç sonu yok. Toplamayı başlattım, ancak sorun, NHibernate'in kullandığı koleksiyonun Contains() yöntemini çağırırken bir nedenden dolayı başarısız olmasıdır. Ben hala soruya açıklanan gremlin hakkında merak ediyorum ve hata ayıklayıcısını ' kod hata ayıklamayı etkinleştir' seçeneğini belirledikten sonra istisnai olarak neden kırmadı ve Thrown istisnalarını da kırmaya ayarla.

neyse, çözüm Department.PressJobRun koleksiyonuna varlık katar çağrıyı önlemek için (Access.PascalCaseField(Prefix.mUnderscore) benim durumunda) alanına PressJobRun.Department erişimi eşlemek etmektir. benim durumumda toplama başlatılmamış olmamasına rağmen

Krzysztof Kozmic's article

, bu açıkladı.

İlgili konular