2009-04-12 14 views
18

के लिए सार्वजनिक/आंतरिक फ़ील्ड को अनदेखा करें मेरे पास कुछ इकाई प्रकार हैं जिन्हें मैं आलसी लोड करना चाहता हूं। हालांकि, उनके पास कुछ आंतरिक (असेंबली) फ़ील्ड हैं जिनका वे खुलासा करते हैं, लेकिन उस वर्ग के बाहर उपयोग नहीं किया जाता है। ये फ़ील्ड संकलक उत्पन्न होते हैं (एफ #) और मैं उन्हें बदल नहीं सकता। एक उदाहरण अपवाद है:NHibernate प्रॉक्सी

NHibernate.InvalidProxyTypeException: Mappings.MTest: निम्नलिखित प्रकार प्रॉक्सी के रूप में इस्तेमाल नहीं किया जा सकता क्षेत्र आईडी @ 47 सार्वजनिक नहीं हो और न ही आंतरिक

मैं चाहिए समझें कि क्यों एनएचबीर्नेट यह कर रहा है, और यदि मैंने उन्हें एक्सेस किया है, तो फ़ील्ड कैसे हैं, जो जेनरेट किए गए प्रॉक्सी के आलसी लोडिंग गुणों को गड़बड़ कर देगा। हालांकि, चूंकि मुझे पता है कि मैं खेतों का उपयोग नहीं करूँगा, क्या मैं किसी भी तरह एनएचबीरनेट को ओवरराइड कर सकता हूं?

क्या कोई तरीका है कि मैं कह सकता हूं "इस क्षेत्र को अनदेखा करें"? मैं फ्लुएंट एनएचबेर्नेट का उपयोग कर रहा हूं, अगर इससे यह आसान हो जाता है।

संपादित करें: मैं यह भी ध्यान दें, मैं NHibernate 2.1.0 अल्फा 2. उपयोग कर रहा हूँ चाहिए

EDIT2: यहां मुख्य सार है कि मैं LazyLoading सक्षम रखना चाहते हैं, जिसका मतलब है मैं प्रॉक्सी पीढ़ी का उपयोग करना है । LazyLoading कार्यों को अक्षम करना (कोई प्रॉक्सी नहीं), लेकिन sorta NHibernate जैसे एक अच्छे ढांचे के उद्देश्य को हरा देता है।

उत्तर

16

मैं NHibernate पुनः एकत्रित करके कोड हटा दिया है कि आंतरिक/सार्वजनिक फ़ील्ड की त्रुटियां। LazyLoading उस चेक के बिना बस ठीक काम करता प्रतीत होता है। (हालांकि, मैं NHibernate करने के लिए नया हूँ और इसलिए शायद परिदृश्यों के बारे में मैं नहीं जानता है।)

संपादित करें: आह, वहाँ एक संपत्ति, "use_proxy_validator" है कि सभी सत्यापन जांच को निष्क्रिय कर देगा है। काफी है।

Fluently.Configure() 
    .ExposeConfiguration(fun cfg -> 
     cfg.Properties.Add("use_proxy_validator", "false"))... 
+1

काम करता है! स्प्रिंग.Net के लिए आप इसे "हाइबरनेटेड प्रॉपर्टीज" में जोड़ सकते हैं '<प्रविष्टि कुंजी =" use_proxy_validator "value =" false "/>' –

0

आप this page पर एक नज़र डालना चाहते हैं जो Fluent NHibernate के साथ F # का उपयोग करने का एक अवलोकन देता है।

संपादित करें मैंने अभी अपना उपयोगकर्ता नाम देखा है। क्या मैं शायद यह सोचने में सही हूं कि यह आपका ब्लॉग है? मेरे बारे में कितना मूर्ख हालांकि, यह आपकी समस्या का समाधान करने के लिए प्रतीत होता है, विशेष रूप से "हम LazyLoad को अक्षम करके शुरू करते हैं क्योंकि अधिकांश गुण वर्चुअल नहीं हैं, और NHibernate मैपिंग को सत्यापित करने में विफल हो जाएगा। इसके बजाय, हम स्टोर संदर्भ की तरह चीजों को स्पष्ट रूप से आलसी लोड करते हैं।" शायद मैं सिर्फ समस्या को गलत समझ रहा हूं।

+0

वास्तव में समस्या है कि। अब मैंने आभासी गुण बनाए हैं, लेकिन बैकिंग फ़ील्ड को निजी बनाने का कोई तरीका नहीं है। मैं आलसी लोडिंग को अक्षम नहीं करना चाहता, मैं चाहता हूं कि NHibernate टी बस इसके साथ रखे :)। मुझे कोई तकनीकी कारण नहीं दिख रहा है जो यह काम नहीं करेगा, इसके बारे में इस सतर्क जांच को छोड़कर। – MichaelGG

+0

मुझे लगता है कि इस तथ्य के साथ और अधिक करना है कि अगर गैर-वर्चुअल सदस्य हैं तो प्रॉक्सी को पहले स्थान पर भी उत्पन्न नहीं किया जा सकता है क्योंकि यह आवश्यक रूप से एक उप-वर्ग है जो सभी सदस्यों को ओवरराइड करता है। दुर्भाग्य से मैं किसी विशेष सलाह देने के लिए एफ # के साथ पर्याप्त परिचित नहीं हूं। –

+0

वे कर सकते हैं, वे बस पाठ्यक्रम के क्षेत्रों को ओवरराइड नहीं कर सकते हैं। मेरा जवाब देखें – MichaelGG

1

आप

[XmlIgnore] 

विशेषता क्षेत्रों को सजाने के लिए (स्रोत और पुनर्निर्माण हो रही तुलना में आसान) का उपयोग कर सकते :)

+0

? यह इसे नजरअंदाज कर दिया और अभी भी दुर्घटनाग्रस्त हो गया। – MichaelGG

+0

अजीब: एस मैंने इसे एक ही तरह की समस्या के लिए इस्तेमाल किया। शायद ऐसा इसलिए है क्योंकि आप FluentNHibernate का उपयोग करते हैं .. – cwap

+0

ओह वह बेकार है :(। यह एक प्यारा समाधान होगा। (हालांकि, मैं वास्तव में इन क्षेत्रों पर विशेषताओं को नहीं डाल सकता)। क्या आपके पास किसी भी दस्तावेज़ का संदर्भ है जो दिखाता है कि XmlIgnore नियंत्रण NHibernate में? धन्यवाद! – MichaelGG

1

क्या आप "प्रयुक्त" फ़ील्ड घोषित करने के लिए इंटरफ़ेस का उपयोग कर सकते हैं? http://nhibernate.info/doc/nh/en/index.html#persistent-classes-poco-sealed

यदि राष्ट्रीय राजमार्ग जावा संस्करण के समान @transient एनोटेशन/विशेषता का उपयोग में एक प्रॉपर्टी को नकारने के मैं नहीं जानता कि "एक और संभावना है एक अंतरफलक है कि सभी सार्वजनिक सदस्यों की घोषणा को लागू करने के वर्ग के लिए है" लगातार संचालन

+0

F # में अंतर्निहित इंटरफ़ेस कार्यान्वयन नहीं है, और वास्तविक फ़ील्ड में संकलक उत्पन्न नाम है। लेकिन मुझे सोच पसंद है। – MichaelGG