6

हमारे पास एक विरासत डेटाबेस है जिसे हम नहीं बदल सकते हैं। और हम पुरानी डेटाएप परत के बजाय एनएचबेर्नेट में जाने की कोशिश कर रहे हैं जो एक कचरा है और बहुत धीमी है।NHibernate नेविगेटर एक समग्र कुंजी समस्या के हिस्से में मैप किए गए - विरासत डेटाबेस उपयोग

यह इस तरह की टेबल है:

GPI टेबल है (PU_ID, PAR_ID, डाटा, Data2) स्तंभों
ब्लॉक टेबल है (GA_ID, डाटा, PAR_ID) स्तंभों
कंपनी टेबल है (PU_ID, डाटा)

GPI

<class name="GroupPartnerInterest" table="[GPI]"> 
    <composite-id > 
     <key-property name="GroupId" column="PAR_ID" /> 
     <key-property name="CompanyId" column="PU_ID" /> 
    </composite-id> 
    <property name="data" column="Data"/> 
    <property name="data2" column="Data2"/> 
    <many-to-one name="Company" fetch="select" cascade="none"> 
     <column name="PU_ID"/> 
    </many-to-one> 
    <set name="Blocks" cascade="none" inverse="true" fetch="select"> 
     <key property-ref="GroupId"> 
      <column name="PAR_ID"/> 
     </key> 
     <one-to-many class="Block"/> 
    </set> 
</class> 
: कॉलम

मैं ऊपर तालिकाओं के लिए इन मैपिंग बनाया था

ब्लॉक

<class name="Block" table="[BLOCK]" > 
    <id name="BlockId" column="GA_ID" > 
     <generator class="assigned"/> 
    </id> 
    <property name="data" column="Data"/> 
    <property name="GroupId" column="PAR_ID"/> 
    <set name="GroupPartnerInterests" cascade="all-delete-orphan" fetch="select"> 
     <key property-ref="GroupId"> 
      <column name="PAR_ID"/> 
     </key> 
     <one-to-many class="GroupPartnerInterest"/> 
    </set> 
</class> 

कंपनी

<class name="Company" table="[COMPANY]"> 
    <id name="CompanyId" column="PU_ID"> 
     <generator class="assigned"/> 
    </id> 
    <property name="data" column="Data"/> 
    <set name="GroupPartnerInterests" cascade="none" inverse="true" fetch="select"> 
     <key> 
      <column name="PU_ID"/> 
     </key> 
     <one-to-many class="GroupPartnerInterest"/> 
    </set> 
</class> 

कक्षाएं बहुत ही सरल और सादे हैं। सभी लागू बराबर और GetHashCode विधियों।

यहाँ नाविकों कि काम की सूची है:

  • GroupPartnerInterest.Company - महान
  • Company.GroupPartnerInterests काम करता है - महान
  • GroupPartnerInterest.Company काम करता है - काम करता है महान

और ये दो असफल:

  • Block.GroupPartnerInterests:

मैं एक इकाई परीक्षण है:

[TestMethod] 
public void TestGroupPartnerInterests() 
{ 
    using (ISession session = SessionFactory.OpenSession()) 
    { 
     IList<Block> blocks = session.CreateCriteria(typeof(Block)) 
      .SetMaxResults(5).List<Block>(); 

     foreach (var block in blocks) 
     { 
      TestContext.WriteLine("Block #{0}", block.BlockId); 

      if (block.GroupPartnerInterests != null) 
      { 
       foreach (GroupPartnerInterest gpi in block.GroupPartnerInterests) 
       { 
        TestContext.WriteLine("Company '{0}':", gpi.Company.CompanyId); 
       } 
      } 
     } 
    } 
} 

अगर मैं GPI मानचित्रण परीक्षण पर काम चल रहा ब्लाकों नेविगेशन मानचित्रण बाहर टिप्पणी और कुछ डेटा आउटपुट:

Block #1
Company 'LALA':
Company 'LALA SA':
Block #2
Company 'BG PO':
Company 'LIMPOPO':
Block #3
Company 'HAHA':
Company 'Other partner(s)':
Block #4

लेकिन परीक्षण निम्न त्रुटि के साथ विफल रहता है:

NHibernate.LazyInitializationException: Initializing[Model.EntityClasses.Block#999]-failed to lazily initialize a collection of role: Model.EntityClasses.Block.GroupPartnerInterests, no session or session was closed.

'999' मौजूद है PAR_ID - डेटा सुसंगत है: इस PAR_ID के साथ दो ब्लॉक हैं और GPI में कुछ रिकॉर्ड हैं।

यह किसी बिंदु पर सत्र क्यों बंद करता है?

  • GroupPartnerInterest.Blocks:

इकाई परीक्षण लगभग एक ही जैसा कि मैंने ऊपर कहा गया है, बस विभिन्न गुणों का उपयोग किया जाता है। कोई त्रुटि के नीचे है:

NHibernate.MappingException: NHibernate.MappingException: property not found: GroupId on entity Model.EntityClasses.GroupPartnerInterest.

अगर मैं हटाने "संपत्ति-रेफरी = ग्रुप" GPI मानचित्रण में ब्लाकों नाविक के तत्व से, मैं निम्न अपवाद मिल जाएगा:

NHibernate.FKUnmatchingColumnsException: NHibernate.FKUnmatchingColumnsException: Foreign key (FKA3966498349694F:[BLOCK] [PAR_ID])) must have same number of columns as the referenced primary key ([GPI] [PAR_ID, PU_ID]).

है जीपीआई में ब्लॉक को मैप करने का कोई तरीका है, इसलिए GroupPartnerInterest.Blocks नेविगेटर काम करेगा?

धन्यवाद, एलेक्स

उत्तर

2
समस्या

निम्नलिखित है:

  • आप एक समग्र आईडी के साथ एक इकाई है, तो यह सभी संदर्भों को समग्र आईडी बनाए रखना होगा, इसलिए वहाँ दो विदेशी कुंजी होना चाहिए।
  • GroupPartnerInterest में ब्लॉक एक सेट है, इसलिए विदेशी कुंजी Blocks में है, जो GroupPartnerInterest पर इंगित करती है। इसके लिए दो विदेशी कुंजी की आवश्यकता होगी, जो उपलब्ध नहीं हैं।
  • property-ref किसी अन्य संपत्ति के साथ प्राथमिक कुंजी को प्रतिस्थापित करना है। इसलिए यह संबंध के एक तरफ टेबल की एक संपत्ति है, जो GroupPartnerInterest है, लेकिन GroupId नहीं है।
  • आप शायद GroupPartnerInterest.Blocks के लिए property-ref इस्तेमाल कर सकते हैं (क्योंकि दो विदेशी कुंजी, याद कर रहे हैं GPI.PAR_ID को Block.PAR_ID बात करने के लिए), लेकिन मैं इसके बारे में दो बार सोचना होगा।

मैं आपको यहां एक समाधान समाधान नहीं दे सकता। मैं समग्र कुंजी का उपयोग नहीं करता और यह अधिक जटिल है। लेकिन कुछ और विचार हैं:

  • मैं समग्र कुंजी से बचने की कोशिश करता हूं। यदि यह संभव नहीं है, तो एक वर्ग लिखें जो समग्र कुंजी का प्रतिनिधित्व करती है। इससे इसे संभालना बहुत आसान हो जाता है।
  • मैं उन प्राथमिकताओं से बचने की कोशिश करता हूं जो प्राथमिक कुंजी पर आधारित नहीं हैं। अन्यथा करने के कारण हो सकते हैं, एनएच उनका समर्थन करता है, मुझे लगता है कि वे परेशानी का कारण बनते हैं।

क्यों सत्र बंद कर दिया है? मुझे नहीं पता, मैं स्टैक ट्रेस पर एक नज़र डालेगा। यह अपवाद वास्तव में उपयोग ब्लॉक के भीतर से फेंक दिया? या इसे TestCleanup विधि से फेंक दिया गया है?

+0

गहन उत्तर के लिए धन्यवाद! मैं डीबी स्कीमा को थोड़ा सा बदलने के लिए हमारी टीम लीड को मनाने की कोशिश करूंगा: GPI तालिका में एक स्वत: उत्पन्न (वृद्धि) प्राथमिक कुंजी जोड़ें। यह संपत्ति-ref = groupId समस्या को ठीक करेगा और मेरी समस्या नेविगेशन गुणों को ठीक करना चाहिए – LucID

+0

मुझे एक बहुत ही समस्या है। मैंने इस परिदृश्य को एक्सएमएल और धाराप्रवाह मैपिंग दोनों के साथ मैप करने की कोशिश की है, लेकिन कोई खुशी नहीं है। दुर्भाग्य से, मैं इस समय स्कीमा नहीं बदल सकता। क्या मैं आपको देखने के लिए मिल सकता हूं? http://stackoverflow.com/questions/25191275/fluent-nhibernate-map-hasmany-to-entity-table-with-no-primary-key –

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