2011-03-31 12 views
7

मेरे पास Fluent NHibernate: How to create one-to-many bidirectional mapping? पर एक समान प्रश्न था, लेकिन मुझे स्थिति में दिलचस्पी थी जब मेरे पास एक-से-एक मैपिंग है। उदाहरणफ्लुएंट एनएचबेर्नेट: एक-से-एक बिडरेक्शनल मैपिंग कैसे बनाएं?

Umbrealla 
    ID 
    Owner 

UmbreallaOwner 
    ID 
    Umbrella 

हम जानते हैं कि प्रत्येक छाता केवल एक ही व्यक्ति के स्वामित्व में किया जा सकता है और कोई भी एक से अधिक छाता मालिक के रूप में लिए। एक धाराप्रवाह मानचित्र में मैं जैसे

UmbrellaMap() 
{ 
    Id(x=>x.ID); 
    References<UmbrellaOwner>(x=>x.Owner); 
} 

UmbrellaOwnerMap() 
{ 
    Id(x=>x.ID); 
    References<Umbrella>(x=>x.Umbrella); 
} 

कुछ जब टेबल धाराप्रवाह umbrellaOwner की आईडी और umbrellaOwner संदर्भित छाता में एक क्षेत्र referncing छाता में एक क्षेत्र पैदा करेगा बनाने के लिए होगा। क्या मैपिंग को बदलने का कोई तरीका है कि केवल एक विदेशी कुंजी बनाई जाएगी लेकिन छाता की संपत्ति और मालिक की संपत्ति दोनों मौजूद होगी? उदाहरण मैंने देखा है दोनों दिशाओं में संबंधों की स्थापना इसलिए

तरह
AddUmbrealla(UmbrellaOwner owner) 
{ 
    var brolly = new Umbrella(); 
    brolly.Owner = owner; 
    owner.Umbrella = brolly; 
    session.Save(owner); //assume cascade 
} 

जो तार्किक लगता है लेकिन थोड़ा बोझिल एक नया छाता लग रहा है जोड़ने शामिल है।

उत्तर

9

अच्छा, एक संदर्भ एक संदर्भ है; एक वस्तु दूसरे के लिए एक संदर्भ है। रिवर्स जरूरी नहीं है।

अपने मामले में, आप एक हैसोन रिश्ते से दूर हो सकते हैं। हालांकि, हैसोन आमतौर पर denormalized डेटा के लिए है। मान लें कि आप मालिक के बारे में अधिक जानकारी चाहते थे, लेकिन आप मालिक की स्कीमा नहीं बदल सके क्योंकि अन्य कोड इस पर निर्भर था। आप एक अतिरिक्तऑनरइन्फो ऑब्जेक्ट बनाते हैं, और स्कीमा में एक टेबल बनाते हैं जिसमें तालिका के मालिक आईडी फ़ील्ड मालिक के लिए एक विदेशी कुंजी थी, और तालिका की प्राथमिक कुंजी भी थी।

आयुन्डे एक-से-एक मामलों में 99.9% में दो तरफा संदर्भ() संबंधों की सिफारिश करता है, जहां दूसरी वस्तु अवधारणात्मक रूप से पहले से अलग होती है, लेकिन एक निहित "मैं अकेले ही एक चीज़ का मालिक हूं" प्रकार रिश्ते का संदर्भ संदर्भण पर Unique().Not.Nullable() संशोधक सेट का उपयोग करके आप संदर्भ की "एक और एकमात्र" प्रकृति को लागू कर सकते हैं।

रेफरेंशियल सेटअप को व्यवस्थित करने के लिए, "ऑब्जेक्ट" और अन्य (छाता) के रूप में "बच्चे" के रूप में और अन्य (छाता) को "बच्चे" के रूप में परिभाषित करने पर विचार करें, और माता-पिता के प्रॉपर्टी सेटर में, बच्चे के माता-पिता को वर्तमान संदर्भ में सेट करें:

public class Umbrella 
{ 
    public virtual string ID { get; set; } 
    public virtual Owner Owner { get; set; } 
} 

public class UmbrellaOwner 
{ 
    public virtual string ID { get; set; } 
    private Umbrella umbrella; 
    public virtual Umbrella Umbrella 
    { 
    get{ 
     return umbrella; 
    } 
    set{ 
     umbrella = value; 
     if(umbrella != null) umbrella.Owner = this; 
    } 
    } 
} 

अब, जब आप माता-पिता के लिए बच्चे असाइन करते हैं, backreference स्वतः की स्थापना की है:

var owner = new UmbrellaOwner{Umbrella = new Umbrella()}; 
Assert.AreEqual(owner, owner.Umbrella.Owner); //true; 
संबंधित मुद्दे