2010-12-07 16 views
5

के साथ एक-से-एक संबंध मैप करना मुझे एनएचबीर्नेट में इस संबंध को मॉडल करना है (कोड को विषय पर रहने के लिए थोड़ा सा सरल बनाना) - एक कर्मचारी खाताधारक हो सकता है (इसलिए, यह वैकल्पिक है):गलत (ब्राउनफील्ड) डेटाबेस स्कीमा

तालिका कर्मचारी (आईडी, संख्या, नाम) तालिका EmployeeIsAccountManager (संख्या, MaxAllowedDiscount)

बजाय में तालिका EmployeeIsAccountManager तालिका कर्मचारी की ओर इशारा करते एक आईडी विदेशी कुंजी होने के

, मैं कर्मचारी में एक संख्या स्तंभ है तालिका जो तालिका कर्मचारी संख्या प्रबंधक में संख्या कॉलम को इंगित करती है।

मैं इसे NHibernate में कैसे मैप करूं? मैंने EmployeeIccountManager क्लास मैपिंग पर विदेशी जनरेटर का उपयोग करने का प्रयास किया है, लेकिन यदि मैं संख्या का उपयोग विदेशी जनरेटेड मान के रूप में करता हूं, तो यह कर्मचारी की आईडी पर नक्शा करता है, जो संख्या के बजाय आईडी है। मैं रचना का उपयोग करने के मेरी कक्षा मॉडलिंग:

public class Employee 
{ 
    public virtual int Id { get; set; } 
    public virtual short Number {get; set; } 
    public virtual string Name {get; set; } 
    public virtual AccountManager AccountManager { get; set; } 
} 

public class AccountManager 
{ 
    public virtual short Number { get; set; } /*needed because of ID only?*/ 
    public virtual decimal MaxAllowedDiscount { get; set } 
} 

मैंने बहुत कोशिश की है (एक-से-एक, कई-टू-वन, विदेशी जनरेटर), लेकिन मैं समझ नहीं इस के साथ किया जा सकता है अगर NHibernate। बीटीडब्ल्यू: मैं कक्षाएं, मैपिंग इत्यादि बदल सकता हूं लेकिन मैं ब्राउनफील्ड स्थिति (कोड के 2+ मिलियन लाइनों के साथ पुराना आवेदन, लगभग 1000 रूपों) के कारण तालिका संरचना को बदल नहीं सकता हूं।

किसी भी मदद की सराहना की है, धन्यवाद! टेड

+1

संपत्ति-रेफरी मानचित्रण विशेषता देखिए ... – JulianM

उत्तर

0

आपका प्रश्न मुझे कक्षा विरासत के बारे में सोचने के लिए तैयार करता है, तो आप अपने वर्ग खाता प्रबंधक को कर्मचारी के उप-वर्ग के रूप में मानचित्रित कर सकते हैं और फिर आप जो करना चाहते हैं वह करने में सक्षम होंगे, मैंने आपके लिए मैपिंग की है लेकिन आप के रूप में डिज़ाइन किया गया तालिकाओं कि जिस तरह से अपनी आवश्यकताओं का समाधान नहीं होता क्योंकि वहाँ दो अंक आप अपने मानचित्रण में सूचना के लिए कर रहे हैं:

  1. कर्मचारी तालिका में नंबर संपत्ति क्रम में खाता प्रबंधक को foreing कुंजी एक अनूठे प्रकार का होना चाहिए इस्तेमाल किया जाएगा एक विदेशी कुंजी के रूप में, लेकिन यहां तक ​​कि यह काम नहीं करता है क्योंकि NHibernate, जब आप एक नया खाता प्रबंधक डालने का प्रयास करते हैं तो व्यक्ति तालिका में एक रिकॉर्ड डालेगा और फिर Accou के संख्या कॉलम पर व्यक्ति की आईडी असाइन करेगा ntManager जो आपको तोड़ने की जरूरत है।
  2. मैपिंग एक से अधिक के रूप में एक ही कारण के लिए काम नहीं करता है। खाता प्रबंधक की संख्या संपत्ति प्राथमिक कुंजी है? अनोखा है? NHibernate, प्राथमिक कुंजी के बिना काम नहीं कर सकते हैं ताकि क्रम में है कि संबंध बनाने के लिए आप एक आईडी स्तंभ

अंतिम विकल्प जो मेरे मन में आता है में एक संपत्ति का उपयोग करने के लिए है के रूप में खाता प्रबंधक की संख्या propety बारे में बताने की काम करने के लिए कर्मचारी वर्ग ने को खाता प्रबंधक तालिका में एक फॉर्मूला के साथ मैप किया जहां आप अपनी इच्छित मान प्राप्त करने के लिए एक कस्टम चयन निर्दिष्ट कर सकते हैं, मैं संपत्ति MaxAllowedDiscount मानता हूं, लेकिन जब आप फ़ॉर्मूला के साथ किसी संपत्ति को मैप करते हैं, तो इसमें कुछ सीमा भी होती है, इस संपत्ति को सम्मिलित नहीं किया जा सकता है न ही अद्यतन किया।

उम्मीद है कि यह मदद करता है यदि प्रश्न हैं तो मुझे बताएं।

+0

मैं डेटाबेस स्कीमा के लिए एक अतिरिक्त अनावश्यक क्षेत्र जोड़ा तो मैं इस रूप में मैं चाहिए मैप कर सकते के साथ । फ़ील्ड को डेटाबेस में ट्रिगर द्वारा प्रबंधित किया जाता है। – TedOnTheNet

0
public class Employee 
{ 
    public virtual short Number 
    { 
     get { return (AccountManager == null) ? 0 : AccountManager.Number; } 
     set 
     { 
      if (AccountManager == null) 
       AccountManager = new AccountManager(); 
      AccountManager.Number = value; 
     } 
    } 
    public virtual AccountManager AccountManager { get; set; } 
} 

या GeneratedBy.Assinged()

public class Employee 
{ 
    public Employee() 
    { 
     AccountManager = new AccountManager(); 
    } 

    public virtual AccountManager AccountManager 
    { 
     get; 
     set { value.Parent = this; _accountManager = value; } 
    } 

    public class AccountManager 
    { 
     Internal protected virtual Employee Parent { get; set; } 

     protected virtual short Number { get { return Parent.Number; } set { } } /*needed because of ID only?*/ 
     public virtual decimal MaxAllowedDiscount { get; set } 
    } 
} 
संबंधित मुद्दे