2012-01-24 28 views
8

यहाँ मेरी स्थिति है ..
मान लीजिए आप निम्नलिखित मॉडल संस्थाओं, जो अपने दम पर एक टेबल का प्रतिनिधित्व करते हैं:

सिनेमा [Movie_Id, शीर्षक, रेटिंग, ..]
अभिनेता [Actor_Id, प्रथम नाम, अंतिम नाम, ..]
निदेशक [Director_Id, प्रथम नाम, अंतिम नाम, ..]

और किसी अन्य संस्था/तालिका "अनुशंसाएँ" कहा जाता है, जो फिर से वेबसाइट के भीतर उपयोगकर्ताओं के बीच सिफारिशें प्रस्तुत करता है। विचार यह है कि एक सिफारिश किसी भी प्रकार की हो सकती है, यानी कोई अभिनेता की सिफारिश करता है, या कोई फिल्म की सिफारिश करता है। असल में, तालिका कुछ इस तरह दिखना चाहिए:

अनुशंसाएँ [Recommendation_Id, object_id, object_type, ..]

और यहाँ क्या मैं में अटक कर रहा हूँ। मैं इन संबंधों को फ्लुएंट के साथ nHibernate में कैसे मैप कर सकता हूं? मेरा मतलब है .. मैपिंग करते समय, मैं रनटाइम पर निर्धारित प्रकार (जो तालिका से संबंधित) 'कारण निर्दिष्ट नहीं कर सकता, लेकिन मैं केवल आईडी के कारण पर भरोसा नहीं कर सकता हूं, यह इस बात का संकेत नहीं दे सकता कि कौन सी तालिका संबंधित है ।
उदाहरण के लिए, अनुशंसाएँ मेज पर इस रिकॉर्ड की कल्पना:

Recommendation_Id - object_id - object_type
83001--401--- "एम"

मूल रूप से मैं एक चार पहचानकर्ता (भंडारण कर रहा हूँ इस मामले में " एम "टेबल के लिए खड़ा है" मूवीज़ ") यह जानने के लिए कि कौन सी तालिका ऑब्जेक्ट_आईडी संबंधित है। मैं ऑब्जेक्ट_आईडी के बिना ऑब्जेक्ट_आईडी को स्टोर नहीं कर सकता ..
मानचित्रण

अंतिम टिप्पणियों के रूप में, मैं यह जोड़ना चाहता हूं कि मैंने सभी टेबल-प्रति-वर्ग, टेबल-प्रति-सबक्लास, टेबल-प्रति-कंक्रीट-क्लास देखा है उदाहरण, लेकिन मुझे विश्वास है कि इनमें से कोई भी इस स्थिति में फिट नहीं है, जैसे Movies_Id, Actors_Id, Directors_Id, ... उनके बीच सभी अलग हैं, इसलिए सिफारिशें_आईडी है। मेरा मतलब है, यहां कोई बेस क्लास-चाइल्ड क्लास विरासत नहीं है, वे आईडी को बिल्कुल साझा नहीं करते हैं ..

मुझे उम्मीद है कि मैं खुद को स्पष्ट कर दूंगा। अग्रिम धन्यवाद।

+0

ऐसा लगता है धाराप्रवाह NHibernate वर्तमान में कई करने के लिए किसी भी जो मैंने सोचा था कि यह क्या करना होगा का समर्थन नहीं करता है। जब तक कि मैं गलत नहीं हूं, जब आप मूवी अपडेट करते हैं तो अनुशंसा को सहेजना निर्बाध रूप से नहीं होगा।डैनियल का जवाब किसी और चीज के करीब था जो मुझे मिल सकता था; ओ) – JasonCoder

+0

यदि आप 'किसी भी' रिश्ते के दूसरे पक्ष को मैप करना चाहते हैं, जैसा कि 'मूवी। सिफारिश' में है, मुझे विश्वास है कि आप इसे 'एक' के साथ कर सकते हैं संग्रह से कई 'और' जहां = "ऑब्जेक्ट_Type = 'M'" विशेषता है, जिसे आप फ्लुएंट एनएचबेर्नेट के साथ कर सकते हैं। –

उत्तर

11

एनएचबेर्नेट मैपिंग जो आप ढूंढ रहे हैं <any/> है।

मेरा मानना ​​है कि * .hbm.xml है कि आप कर रहे हैं: यहाँ कुछ संसाधनों मदद करने के लिए आप इस NHibernate मानचित्रण सुविधा के साथ लाने के लिए उठो हैं शूटिंग के लिए कुछ ऐसा है:

<class name="Recommendation" table="Recommendations"> 
    <id name="Id"> 
    <column name="Recommendation_Id" /> 
    <generator class="native"/> 
    </id> 

    <any name="RecommendedObject" id-type="System.Int32" meta-type="System.String"> 
    <meta-value value="M" class="Movie"/> 
    <meta-value value="A" class="Actor"/> 
    <meta-value value="D" class="Director"/> 
    <column name="Object_Type"/> 
    <column name="Object_Id"/> 
    </any> 

    <!-- other stuff ... --> 
</class> 

तुम इतनी तरह पूरा करने के लिए है कि धाराप्रवाह NHibernate के साथ सिफ़ारिश की मैपिंग में सक्षम होना चाहिए:

ReferencesAny(x => x.RecommendedObject) 
    .IdentityType<int>() 
    .EntityTypeColumn("Object_Type") 
    .EntityIdentifierColumn("Object_Id") 
    .AddMetaValue<Movie>("M") 
    .AddMetaValue<Actor>("A") 
    .AddMetaValue<Director>("D"); 
+0

बहुत बहुत धन्यवाद !!!! मैंने इसका परीक्षण किया है और ठीक काम करता प्रतीत होता है। गंभीरता से, दस लाख धन्यवाद डैनियल! : =) –

+0

क्या आप कृपया 'ऑब्जेक्ट अनुशंसित ऑब्जेक्ट' पर 'ऑब्जेक्ट_आईडी' द्वारा फ़िल्टरिंग के साथ क्वेरी करने के लिए उदाहरण दिखा सकते हैं? –

+0

@ क्रिस्टियन, क्या आप http://stackoverflow.com/questions/21940396/fluentnhibernate-referencesany-how-to-use-queryover-with-filter का जिक्र कर रहे हैं? –

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