2010-03-07 9 views
8

के माध्यम से क्रमबद्ध नहीं किया जा सकता है मान लें कि मेरे पास अभिभावक, बाल संबंध वर्ग और मैपिंग है। मैं डेटाबेस से ऑब्जेक्ट को पढ़ने के लिए NHibernate का उपयोग कर रहा हूं, और ऑब्जेक्ट को तार में ऑब्जेक्ट भेजने के लिए डब्ल्यूसीएफ का उपयोग करना चाहता हूं।आलसी लोडिंग बंद करें या NHibernate में किसी संपत्ति को लोड करना छोड़ें? प्रॉक्सी को डब्ल्यूसीएफ

लक्ष्य

  • पैरेंट ऑब्जेक्ट पढ़ने के लिए, मैं चुनिंदा, विभिन्न निष्पादन पथ पर, तय करने के लिए जब मैं बच्चा वस्तु लोड करने के लिए चाहते हो जाएगा चाहते हैं। क्योंकि मैं जो कुछ चाहिए उससे ज्यादा पढ़ना नहीं चाहता हूं।
  • वे आंशिक रूप से लोड ऑब्जेक्ट डब्ल्यूसीएफ के माध्यम से भेजने में सक्षम होना चाहिए। जब मेरा मतलब है कि मैं इसे लोड नहीं करता हूं, तो कोई भी पक्ष ऐसी संपत्ति तक नहीं पहुंच पाएगा।

समस्या

  • के रूप में उन संपत्ति [DataContract] के रूप में चिह्नित किया गया है इस तरह के आंशिक रूप से भरी हुई वस्तु, WCF के माध्यम से भेजा जा रहा है, यह के रूप में संपत्ति असली नाम से जाना जाता लिखने के बजाय आलसी लोड प्रॉक्सी है धारावाहिक नहीं किया जा सकता।

क्या मैं संग्रह करने के लिए चाहते हैं, या समाधान है कि मैं के

  • lazy=false या lazy=true काम नहीं करता है सोच सकते हैं। पूर्व उत्सुकता से सभी रिश्तों को लाएगा, बाद में प्रॉक्सी बनायेगा। लेकिन मुझे इसके बजाय कुछ भी नहीं चाहिए - null सबसे अच्छा होगा।
  • मुझे आलसी लोड की आवश्यकता नहीं है। मुझे उन संदर्भों के लिए null प्राप्त करने की उम्मीद है जो मैं नहीं लेना चाहता हूं। एक शून्य, लेकिन सिर्फ एक प्रॉक्सी नहीं। यह डब्ल्यूसीएफ को खुश कर देगा, और आलसी लोड प्रॉक्सी बनाने के लिए कम समय बर्बाद करेगा।
    क्या मुझे एक नल प्रॉक्सी फैक्ट्री मिल सकती है?
    -OR-
  • या उन संपत्तियों को अनदेखा करने वाली डब्ल्यूसीएफ बनाना जो असली के बजाय प्रॉक्सी है। मैंने the IDataContractSurrogate solution की कोशिश की, लेकिन केवल माता-पिता को GetObjectToSerialize पर पास किया गया है, मैं कभी भी GetObjectToSerialize के माध्यम से पारित प्रॉक्सी का निरीक्षण नहीं करता, जिससे इसे अन-प्रॉक्सी करने का कोई मौका नहीं मिलता है।

संपादित

टिप्पणियां पढ़ने इंटरनेट पर, अधिक सर्फिंग के बाद ...

मुझे ऐसा लगता है कि डीटीओ सर्वर साइड करने के लिए गणना का प्रमुख हिस्सा बदलाव होगा। लेकिन जिस परियोजना के लिए मैं काम कर रहा हूं, 50% ग्राहक क्लाइंट से "स्मार्ट" है और सर्वर प्रमाणीकरण और सत्यापन के साथ डेटा स्टोर की तरह है। हालांकि मैं मानता हूं कि सर्वर बिल्कुल गूंगा नहीं है - मुझे यह तय करना होगा कि अतिरिक्त संदर्भ पहले से कब प्राप्त करें, और डीटीओ इसे बहुत स्पष्ट बना देगा।

शायद मुझे दर्द होना चाहिए। मुझे पहले http://automapper.codeplex.com/ पता नहीं था, इससे मुझे दर्द लेने के लिए थोड़ा और प्रेरित किया जाता है।

दूसरी ओर, मुझे http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/ मिला, जो IDataContractSurrogate.GetObjectToSerialize के साथ काम कर रहा है।

+8

तार के माध्यम से इकाइयों को न भेजें। डीटीओ का प्रयोग करें, तो आपको आलसी लोड प्रॉक्सी –

+0

http://stackoverflow.com/questions/577201/returning-nhibernate-mapping-classes-from-wcf-services http://stackoverflow.com/questions के साथ कभी भी समस्या नहीं होगी/616314/हैं-वहां-कोई-गॉथस-जब-उपयोग-कास्ट-एक्टिवॉर्ड-निबर्ननेट-साथ-डब्ल्यूसीएफ http://stackoverflow.com/questions/2312563/nhibernate-lazy-initialized-collection-on-wcf-wire http : //stackoverflow.com/questions/1681538/nhibernate-and-wcf-serializationunidirectional –

+0

automapper के बारे में नहीं पता था। शायद मुझे डीटीओ के साथ जाना चाहिए। – HelloSam

उत्तर

1

मैंने प्रदर्शन के साथ समान मुद्दों में भाग लिया है, इसके बजाय मैंने DetachedCriteria का उपयोग करके डीबी को एक स्पष्ट कॉल का उपयोग करके जो जानकारी मांगी थी, उसे पहले से लोड किया था।

तो आप जो भी कर रहे हैं उसके समान मैं शायद ऐसा कुछ करूंगा।

public DetachedCriteria BuildMyCriteria() 
{ 
    var criteria = DetachedCriteria.For<ParentClass>(); 
    criteria.CreateCriteria("this.ChildClass", "Child Class").SetFetchMode("this.ChildClass", FetchMode.Eager); 
    criteria.Add(Restrictions.IsNotNull("ChildClass.Property");  

    return criteria; 
} 
तब मेरे मुखौटा से

, मैं गुण बच्चे संपत्ति

var myClasses = _repository.ExecuteDetachedCriteria<ParentClass>(BuildMyCriteria); 

पर अशक्त गुण नहीं है तो मैं सभी ParentClass संस्थाओं एक अशक्त संपत्ति है कि होता है के साथ उन संस्थाओं मिलेगा।

तो जानकारी के लिए लगातार डीबी पूछकर हिट लेने की बजाय, मैं इसे स्मृति में संग्रहीत करता हूं इसलिए यह मेरे लिए उपयोग करने के लिए तैयार है।

यह DTOs करने के लिए सिर्फ एक वैकल्पिक समाधान है, अच्छी किस्मत :)

2

था WCF-सिल्वरलाइट डीटीओ/संस्थाओं के स्थानांतरित के साथ एक ही मुद्दा हो रही है।

धाराप्रवाह NHibernate:: मैं कोड है जो ठीक काम करता है निम्न का उपयोग

References(c => c.DataSource) 
    .Column("DataSourceId") 
    .Cascade.None() 
    .Not.LazyLoad(); 
HasManyToMany(c => c.Categories) 
    .Table("Categories") 
    .ParentKeyColumn("ItemId") 
    .ChildKeyColumn("CategoryId") 
    .Not.LazyLoad() 
    .Cascade.None() 
    .Inverse(); 

एक्सएमएल:

<many-to-one name="DataSource" column="DataSourceId" lazy="false" cascade="none" /> 

आशा यह आपके लिए काम करेंगे!

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