हमारे पास एक विरासत डेटाबेस है जिसे हम नहीं बदल सकते हैं। और हम पुरानी डेटाएप परत के बजाय एनएचबेर्नेट में जाने की कोशिश कर रहे हैं जो एक कचरा है और बहुत धीमी है।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 नेविगेटर काम करेगा?
धन्यवाद, एलेक्स
गहन उत्तर के लिए धन्यवाद! मैं डीबी स्कीमा को थोड़ा सा बदलने के लिए हमारी टीम लीड को मनाने की कोशिश करूंगा: GPI तालिका में एक स्वत: उत्पन्न (वृद्धि) प्राथमिक कुंजी जोड़ें। यह संपत्ति-ref = groupId समस्या को ठीक करेगा और मेरी समस्या नेविगेशन गुणों को ठीक करना चाहिए – LucID
मुझे एक बहुत ही समस्या है। मैंने इस परिदृश्य को एक्सएमएल और धाराप्रवाह मैपिंग दोनों के साथ मैप करने की कोशिश की है, लेकिन कोई खुशी नहीं है। दुर्भाग्य से, मैं इस समय स्कीमा नहीं बदल सकता। क्या मैं आपको देखने के लिए मिल सकता हूं? http://stackoverflow.com/questions/25191275/fluent-nhibernate-map-hasmany-to-entity-table-with-no-primary-key –