2009-10-29 9 views
9

के माध्यम से नहीं, मुझे अपने वर्तमान प्रोजेक्ट में एक अजीब समस्या है। प्रश्नों के लिए आलसी लोडिंग काम नहीं करता है। जब मैं एक सूची पूछता हूं, तो निषेध सभी संगठनों को अलग से लाता है।NHibernate सत्र के माध्यम से प्रॉक्सी बनाता है। लोड(), लेकिन लिंक या मानदंड API

मैंने इसके छोटे हिस्सों को निकाला और इसे एक अलग समाधान में डाल दिया। असल में जो मुझे मिला है, वह खाता-सारणी और खाता सिंक-टेबल है। दोनों में एक आईडी और एक यूआरएल है, जबकि आईडी सिर्फ एक डीबी-गाइड है।

मेरे वर्ग हैं:

public class HippoAccount 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Url { get; set; } 
    public virtual HippoAccountSync Sync { get; set; } 
} 

public class HippoAccountSync 
{ 
    public virtual Guid Id { get; set; } 

    public virtual string Url { get; set; } 
    public virtual HippoAccount Account { get; set; } 
} 

जब मैं अब एक वस्तु लोड के माध्यम से इसे GUID है:

var account = session.Load<HippoAccount>(accountId); 
Console.WriteLine(NHibernateUtil.IsPropertyInitialized(account, "Sync")) 

... यह false वापस आती है और खाते में ही एक प्रॉक्सी है।

लेकिन जब मापदंड एपीआई के माध्यम से एक सूची लोड:

var account = (HippoAccount)session 
    .CreateCriteria(typeof (HippoAccount)) 
    .Add(Restrictions.Eq("Id", accountId)) 
    .List()[0]; 

... संपत्ति Sync प्रारंभ हो जाता है (एक दूसरे का चयन क्वेरी फायरिंग), और लौट आए वस्तु एक प्रॉक्सी नहीं है।

क्या यह डिफ़ॉल्ट व्यवहार है? मुझे क्या गलत हो रहा है?

मानचित्रण है:

<class name="HippoAccount" table="AllAccounts"> 
    <id name="Id" type="guid"> 
    <generator class="guid"/> 
    </id> 
    <property name="Url" /> 

    <many-to-one 
      class="HippoAccountSync" 
      name="Sync" 
      not-found="ignore" 
      property-ref="Url"> 
    <column name="url" /> 
    </many-to-one> 
</class> 

<class name="HippoAccountSync" 
     mutable="false" 
     table="Accounts"> 

    <id name="Id" type="guid"> 
    <generator class="guid"/> 
    </id> 

    <property name="Url"> 
    <column name="serviceUri" /> 
    </property> 

    <many-to-one class="HippoAccount" 
       name="Account" 
       property-ref="Url" 
       not-found="ignore"> 

    <column name="serviceUri" /> 
    </many-to-one> 

</class> 
+0

यकीन नहीं करता है, तो यह पूरी तरह से संबंधित है, लेकिन वहाँ मुद्दों के साथ नहीं पाया = "अनदेखा" कर रहे हैं: http://nhjira.koah.net/browse/NH-1001 http: //guildsocial.web703 .discountasp.net/dasblogce/टिप्पणी दृश्य, guid, ba00b19d-bd60-442b-b2e7-935277a9f1eb.aspx –

+0

आप सही हैं। एक और मुद्दा संपत्ति-रेफरी है - यह आलसी लोडिंग को भी अक्षम करता है। http://maonet.wordpress.com/2007/12/05/lazy-load-conflicts-with-property-ref-in-many-to-one-mapping/ –

उत्तर

10

काफी कुछ और अधिक शोध के बाद, मैं जवाब मिल गया। उत्तर, क्योंकि ऐसी कई चीजें हैं जो NHibernate में आलसी लोडिंग को रोक सकती हैं।

  1. क्वेरी बनाम session.Load: जब session.Load() के माध्यम से एक आइटम प्राप्त करते समय आप एक प्रॉक्सी मिलता है। लेकिन जैसे ही आप किसी भी संपत्ति तक पहुंचते हैं, तो Url कहें, ऑब्जेक्ट को उन सभी संगठनों समेत लाया जाता है जो आलसी लोडिंग का समर्थन नहीं करते हैं।

  2. संपत्ति-रेफरी: आलसी लोडिंग केवल ऑब्जेक्ट आईडी पर काम करती है। जब किसी संपत्ति-एसोसिएशन को लक्ष्य इकाई में एक अलग कॉलम के माध्यम से हल किया जाता है, तो एनएच उत्सुकता से इसे प्राप्त करता है। ऐसा नहीं है कि यह संभव नहीं होगा, यह सिर्फ लागू नहीं किया है: Bug

  3. नहीं पाया = "उपेक्षा"अमान्य विदेशी कुंजी की अनुमति देता है, कि है, अगर संदर्भित इकाई नहीं मिला है राष्ट्रीय राजमार्ग संपत्ति के साथ शून्य में जाएगा। एनएच आलसी लोडिंग के लिए संपत्ति-पहुंच को अवरुद्ध नहीं करता है, बल्कि इसके बजाय ऑब्जेक्ट प्रॉक्सी निर्दिष्ट करता है। not-found="ignore" के साथ यह तय नहीं कर सकता कि संपत्ति को शून्य, या संभवतः अमान्य, विदेशी कुंजी के लिए प्रॉक्सी पर सेट किया जाना चाहिए या नहीं। यह संभवतः संपत्ति के उपयोग को रोककर हल किया जा सकता है।

  4. not-found="ignore" और property-ref अक्षम करते समय स्कीमा निर्यात बाधा उत्पन्न करेगा जो एक परिपत्र संदर्भ को लागू करेगा। अच्छा नही! सही मैपिंग तब एक-से-एक रिश्ते को सीमित कर देगा, जहां HippoAccountSync के लिए कुंजी जनरेटर foreign होनी चाहिए।

संसाधन

+0

सत्र के साथ। लोड(), आप कर सकते हैं, बेशक, डाटाबेस को मारने के बिना प्रॉक्सी की आईडी प्रॉपर्टी को सुरक्षित रूप से एक्सेस करें, क्योंकि आपने प्रॉक्सी को आईडी शुरू करने के लिए दिया है। – Jay

+0

संपत्ति-रेफ बग से लिंक अब मौजूद नहीं है, 404 त्रुटि। इस प्रगति पर कोई विचार? – shanabus

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