2012-08-01 17 views
7

मुझे संग्रह लोड करने में कोई समस्या है। सेटअप मेरे पास FluentNHibernate का उपयोग करके मैप किए गए सरल-से-कई सहयोग हैं। इकाई को अपवाद को अपनाने के साथ लोड किया गया है, लेकिन संबंधित संग्रह डिस्प्ले तक पहुंच "संग्रह लोड करने के लिए अवैध पहुंच"। मैं यहां कोड के प्रासंगिक भाग पेस्ट कर दूंगा।एनएचबेर्नेट संग्रह लोडिंग, "संग्रह लोड करने के लिए अवैध पहुंच"

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

रूप

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); 
    ... 
} 

मैं भी आलसी लोड हो रहा है निष्क्रिय करने के लिए, लाइन को बाहर निकालकर और .Not.LazyLoad() फोन करके की कोशिश की है इस प्रकार मैप किया गया, हालांकि अंत में ही है।

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

मैं सत्र उजागर एहसास करने के लिए बात नहीं है, लेकिन यह सुनिश्चित करें कि सत्र खुला है बनाने के लिए प्रयास में था।

जब मैं अपवाद अंदर घुसते हैं मैं स्टैक ट्रेस निम्न देखें:

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() 

दिलचस्प दुष्टात्मा यहां आता है। मैंने PressJobRun संपत्ति की सेटर लाइन पर ब्रेकपॉइंट सेट किया है।

  • अगर मैं इसे और त्वरित घड़ी pressJobRunField पर कदम, मैं "लोड हो रहा अपवाद करने के लिए अवैध रूप से उपयोग" देखें।
  • यदि मैं पहली बार जल्दी value चर देखता हूं, तो मुझे लोड संग्रह दिखाई देता है। सेटटर लाइन पर कदम उठाने के रूप में काम करता है।

क्या मैं

  • विजुअल स्टूडियो 2012, को लक्षित .NET 4
  • NHibernate 3.3.1.400
  • एसक्यूएल सीई 4
  • कैसल
  • कैसल AutoTx facitlity
  • का उपयोग
  • मैं सत्र पी का प्रबंधन करता हूं एर WCF का अनुरोध अपने आप

मैं क्या कोशिश की है

  • आलसी लोड हो रहा है
  • सुनिश्चित करें कि सत्र खुला है, और यह अपमानजनक कोड के निष्पादन के दौरान एक ही सत्र है कि बनाया अक्षम करने
  • toggled Inverted संग्रह का नक्शा (सोचा मुझे विश्वास है कि इसे उलटा होना चाहिए)
  • साफ़ और पुनर्निर्मित समाधान
  • कॉन्फ़िगरेशन प्रबंधक में सुनिश्चित किया गया है कि समाधान में सभी परियोजनाएं
  • सभी फेंकने वाले अपवादों को तोड़ने के लिए डीबगर सेट करें।डिबगर अपवाद है कि मैं संग्रह में सेट देखें

उत्तर

3

समस्या जब PressJobRub.Department संपत्ति सेट कर दिया जाता है, मेरे कोड भी PressJobRun उचित संग्रह करने के लिए Department में कहते हैं वह यह है कि के साथ नष्ट नहीं होती है। मैंने संग्रह शुरू किया था, लेकिन समस्या यह थी कि संग्रह जो एनएचबीर्नेट उपयोग करता है, Contains() विधि को कॉल करते समय किसी कारण से विफल रहता है। मैं अभी भी प्रश्न में वर्णित gremlin के बारे में आश्चर्यचकित हूं, और जब मैंने 'को हटाया तो डीबगर ने अपवाद पर तोड़ नहीं दिया, तो बस मेरा कोड डीबगिंग' सक्षम करें और इसे पर अपवादों को तोड़ने के लिए सेट करें।

किसी भी तरह, समाधान PressJobRun.Department क्षेत्र में पहुंच (मेरे मामले में Access.PascalCaseField(Prefix.mUnderscore)) को कॉल करने से रोकने के लिए है जो इकाई को Department.PressJobRun संग्रह में जोड़ता है।

Krzysztof Kozmic's article ने इसे समझाया, हालांकि मेरे मामले में संग्रह को प्रारंभ नहीं किया गया था।

संबंधित मुद्दे