2010-09-03 9 views
7

में आईडी के रूप में संदर्भ का उपयोग करना मेरे पास एक बच्चा तालिका है जिसमें माता-पिता को आईडी है। यह एक मैपिंग में से एक है, लेकिन बच्चे की तालिका में मूल्य गुम हो सकते हैं। मुझे त्रुटि के बिना मैपिंग में समस्याएं आ रही हैं हालांकि ... मैंने कई चीजों की कोशिश की है; उसी स्तंभ मानचित्रण, विशिष्ट गुणों आदि होने ..fluentnhibernate

 
Parent table 
    int id 

Child table 
    int parentid 

Parent class 
    int id 

Child class 
    Parent parent // note I'm referencing parent, not using an int id.. 

मानचित्रण

Id(x => x.Parent) 
    .Column("parentid"); // fails 

Id(x => x.Parent.Id) 
    .Column("parentid"); // fails 

References(x => x.Parent) 
    .Column("parentid"); // fails - missing id 

// Adding an id field in addition to parent for 
// child class (id is then the same as parent.id) 
// fails on save 
Id(x => x.Id) 
    .Column("parentid"); 
References(x => x.Parent) 
    .Column("parentid"); 

मैं बच्चे के वर्ग चाहते हैं एक अलग पहचान क्षेत्र के लिए नहीं है, लेकिन वहाँ के रूप में माता-पिता के लिए नहीं बल्कि केवल एक संदर्भ माता-पिता के बिना कभी बच्चा न हो। हालांकि डेटाबेस में, मैं सिर्फ माता-पिता की आईडी को स्टोर करना चाहता हूं।

कोई विचार मैं यह कैसे कर सकता हूं?

उत्तर

5

निम्नलिखित काम करता है:

Id(x => x.Parent.Id).Column("MemberID"); 
References(x => x.Parent).Column("MemberID").ReadOnly(); 

संदर्भ के लिए केवल पठनीय एक अपवाद

संपादित नहीं प्राप्त करने के लिए महत्वपूर्ण है: इतना आसान नहीं था ...

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

public virtual int Id { 
    get { return Parent.Id; } 
    set { Debug.Assert(value == Parent.Id); } 
} 
+0

+1 मुझे यहाँ के लिए काम किया है, लेकिन वहाँ ऐसा करने के लिए एक और अधिक सुरुचिपूर्ण तरीका है? –

0

FluentNHibernate के एपीआई पिछले कुछ वर्षों में बदल गया है तो मुझे यकीन है कि अगर यह वाक्य रचना उपलब्ध था जब इस सवाल का मूल रूप से कहा गया था लेकिन अब आप एक आईडी के रूप में एक संदर्भ का उपयोग कर सकते हैं यदि आप एक समग्र आईडी के रूप में यह नक्शा नहीं कर रहा हूँ। मैं इसे एक हैक नहीं कहूंगा लेकिन यह थोड़ा अजीब बात है कि आपको एक समग्र आईडी के हिस्से के रूप में मूल इकाई के संदर्भ को मैप करना होगा। यहां एक पूर्ण उदाहरण दिया गया है:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     Table("StackOverflowExamples.dbo.Parent"); 

     Id(x => x.ParentId); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
    } 
} 

public class OnlyChildOfParentMap : ClassMap<OnlyChildOfParent> 
{ 
    public OnlyChildOfParentMap() 
    { 
     Table("StackOverflowExamples.dbo.OnlyChildOfParent"); 

     CompositeId().KeyReference(x => x.Parent, "ParentId"); 
     Map(x => x.SomeStuff); 
     Map(x => x.SomeOtherStuff); 
    } 
} 

public class Parent 
{ 
    public virtual int ParentId { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class OnlyChildOfParent 
{ 
    public virtual Parent Parent { get; set; } 
    public virtual string SomeStuff { get; set; } 
    public virtual string SomeOtherStuff { get; set; } 

    #region Overrides 

    public override bool Equals(object obj) 
    { 
     if (obj == null || GetType() != obj.GetType()) 
      return false; 

     var child = obj as OnlyChildOfParent; 

     if (child != null && child.Parent != null) 
     { 
      return child.Parent.ParentId == Parent.ParentId; 
     } 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return Parent.ParentId; 
    } 

    #endregion Overrides 
} 
0

शायद this पोस्ट सहायता कर सकता है।
मैंने एनोटेशन .Cascade.SaveUpdate() का उपयोग किया है।
मेरे मामले माता-पिता दोनों पक्षों

Obs पर एनोटेशन डालने में एक hasone के साथ था: भाषा पीटी बीआर

+0

यदि आप लिंक किए गए उत्तर के प्रासंगिक भाग का अनुवाद कर सकते हैं तो यह सहायक होगा ... –

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