2011-10-27 14 views
7

मैं एक विरासत प्रणाली को मैप करने के लिए CompositeId का उपयोग करने का प्रयास कर रहा हूं। स्रोत डेटाबेस में एक समग्र प्राथमिक कुंजी है इसलिए मैं सामान्य का उपयोग नहीं कर सकता। आईडी मैपिंग।CompositeId कारण मैपिंग दस्तावेज़ त्रुटि संकलित नहीं कर सका

यहाँ मेरी यह मैप करने के लिए प्रयास है:

public PriorityListPartMap() 
{ 
    this.Schema("EngSchedule"); 

    this.Table("vPriorityListPart"); 

    this.CompositeId().KeyProperty(x => x.AssemblyPartNumber).KeyProperty(x => x.PartNumber); 

    this.Map(x => x.CurrentDueDate); 

    this.Map(x => x.OrderLine); 

    this.Map(x => x.OrderNumber); 

    this.Map(x => x.PartDescription); 

    this.Map(x => x.ProductCode); 

    this.Map(x => x.Revision); 
} 

जब मैं सत्र कारखाने इस मानचित्रण त्रुटि होती है बनाने की कोशिश: (XmlDocument)

मैंने कोशिश की: मानचित्रण दस्तावेज़ संकलन नहीं किया जा सका

this.Id(x => x.AssemblyPartNumber).GeneratedBy.Assigned(); 

त्रुटि है कि मानचित्रण के साथ चला जाता है, लेकिन मैं वास्तव में उस पाप का उपयोग नहीं कर सकते हैं: CompositeId मानचित्रण को दूर करने और से बदल दिया विधानसभा पार्ट नम्बर अद्वितीय नहीं है।

क्या एक समग्र प्राथमिक कुंजी वाले तालिका में मानचित्र करने का कोई अलग तरीका है?

धन्यवाद,

मैथ्यू MacFarland

उत्तर

25

भीतरी अपवाद "मानचित्रण दस्तावेज़ संकलन नहीं कर सका: (XmlDocument)" के लिए क्या है? मेरा सिद्धांत यह है कि "समग्र-आईडी वर्ग बराबर ओवरराइड(): YOURNAMESPACE.PriorityListPart" होना चाहिए।

समग्र-आईडी की आवश्यकता वाले इकाइयों के लिए, ऑब्जेक्ट स्वयं कुंजी के रूप में उपयोग किया जाता है। ऐसी वस्तुओं के क्रम में जिन्हें 'समान' माना जाता है, आपको समानताएं और GetHashCode विधियों को ओवरराइड करने की आवश्यकता है।

एक उदाहरण के बराबर अपनी इकाई के लिए विधि कुछ इस तरह होगा:

public override bool Equals(object obj) 
{ 
    var other = obj as PriorityListPart; 

    if (ReferenceEquals(null, other)) return false; 
    if (ReferenceEquals(this, other)) return true; 

    return this.AssemblyPartNumber == other.AssemblyPartNumber && 
     this.PartNumber == other.PartNumber; 
} 

अपनी इकाई के लिए एक उदाहरण GetHashCode विधि कुछ इस तरह होगा:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     int hash = GetType().GetHashCode(); 
     hash = (hash * 31)^AssemblyPartNumber.GetHashCode(); 
     hash = (hash * 31)^PartNumber.GetHashCode(); 

     return hash; 
    } 
} 

यह भी मतलब है कि अगर आप किसी ऑब्जेक्ट को पुनर्प्राप्त करना चाहते हैं, आपके पास ऐसा करने के लिए एक भी कुंजी नहीं हो सकती है। अपने समग्र कुंजी घटकों के साथ एक विशिष्ट ऑब्जेक्ट को सही तरीके से पुनर्प्राप्त करने के लिए, आप जिस कुंजी का उपयोग करते हैं वह वास्तव में उस वस्तु के लिए सेट की गई प्रमुख कुंजी घटकों के साथ ऑब्जेक्ट का एक उदाहरण है जिसे आप पुनर्प्राप्त करना चाहते हैं।

यही कारण है कि समान() विधि को ओवरराइड किया जाना चाहिए, ताकि एनएचबीर्नेट में यह निर्धारित करने की क्षमता हो कि आप वास्तव में कौन सी वस्तु को पुनर्प्राप्त करने की कोशिश कर रहे हैं, जो कि आप समान विधि में निर्दिष्ट करते हैं।

+0

यह ** शानदार ** है! पूरी तरह से काम किया। मेरी मूल त्रुटि में आंतरिक अपवाद नहीं था, यह शून्य था, लेकिन आपका समाधान वैसे भी सही था। आपकी सहायता के लिए बहुत धन्यवाद। –

+0

बिल्कुल सही समाधान - मेरे लिए काम करता है! मेरी इकाइयां बराबर के बिना http://nmg.codeplex.com/ द्वारा बनाई गई थीं। – Henrik

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