20

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

असल में, परिदृश्य यह है - मेरे पास एक श्रेणी है, जिसमें कई माता-पिता हो सकते हैं। इस प्रकार, एक श्रेणी में माता-पिता के साथ-साथ कई अन्य श्रेणियां भी अपने बच्चों के रूप में कई अन्य श्रेणियां होती हैं।

HasManyToMany(x => x.ParentCategories).AsBag().Table("parentcategorychildren").ParentKeyColumn("ChildID").ChildKeyColumn("ParentID").Cascade.SaveUpdate(); 
HasManyToMany(x => x.ChildrenCategories).AsBag().Table("parentcategorychildren").ParentKeyColumn("ParentID").ChildKeyColumn("ChildID").Inverse(); 

हालांकि, जब मैं कारखाना बनाने की कोशिश, मैं निम्नलिखित त्रुटि मिलती है:

The relationship Category.ChildrenCategories to Category.ChildrenCategories has Inverse specified on both sides. Remove Inverse from one side of the relationship.

क्या मैं अजीब लग रहा है क्यों यह Category.ChildrenCategories करने के लिए 'Category.ChildrenCategories' का उल्लेख किया जाता है, अभिभावक श्रेणियों के विरोध में?

किसी भी मदद की सराहना की जाएगी!

मैंने अभी इसके लिए एक बक्षीस बनाया है, क्योंकि यह मेरे लिए काफी महत्वपूर्ण है। कृपया, मुझे एक जवाब के रूप में "आप ऐसा नहीं कर सकते" में रूचि नहीं है।

+0

हमें एक ही समस्या है। एक जवाब की सराहना की जाएगी। –

+0

यदि यह वास्तव में एफएनएच में एक बग है, तो आप हमेशा पारंपरिक एक्सएमएल मैपिंग या उत्तर में दिए गए वर्कअराउंड का उपयोग कर सकते हैं। – Vadim

+0

मैंने इसके लिए [एक मुद्दा] उठाया है (http://fluentnhibernate.lighthouseapp.com/projects/33236-fnh/tickets/212-inverse- validation-fails-on-self-referential-relationships)। हम इसे एएसएपी ठीक कर देंगे। –

उत्तर

12

यह संभवतः एक एफएनएच बग है और यह संभवतः नवीनतम एफएनएच source code में पहले से तय है। FNH1.0 और NH2.1 का उपयोग करते समय कोई समस्या नहीं है। समतुल्य HBM मानचित्रण FNH1.2 और NH3.1 में अच्छी तरह से काम करता है:

<bag name="ParentCategories" cascade="all" table="parentcategorychildren"> 
    <key column="ChildID" /> 
    <many-to-many column="ParentID" class="Category" /> 
</bag> 

<bag name="ChildrenCategories" inverse="true" table="parentcategorychildren"> 
    <key column="ParentID" /> 
    <many-to-many column="ChildID" class="Category" /> 
</bag> 

संपादित करें: FNH स्रोत कोड में खुदाई करने के बाद मैं एक वैकल्पिक हल मिल गया। मान लें, आपके विन्यास इस तरह दिखता है:

.Mappings(m => { 
    m.FluentMappings.AddFromAssemblyOf<Category>(); 
}) 

अशुभ कोड इस विन्यास द्वारा दबा दिया जा सकता है:

.Mappings(m => { 
    var persistenceModel = new PersistenceModel(); 
    persistenceModel.AddMappingsFromAssembly(typeof(Category).Assembly); 
    persistenceModel.ValidationEnabled = false; // this makes the trick 
    m.UsePersistenceModel(persistenceModel); 
}) 
+0

आप यहां चेक कोड देख सकते हैं https://github.com/jagregory/fluent-nhibernate/blob/release-1.2/src/FluentNHibernate/Visitors/ValidationVisitor.cs और यह अभी भी एफएनएच के नवीनतम संस्करण में प्रतीत होता है। क्या केवल एक मानचित्र पर सत्यापन अक्षम करने का कोई तरीका है? –

+0

हां, यह 1.2 टैग है। नवीनतम कोड मास्टर शाखा (https://github.com/jagregory/fluent-nhibernate/blob/master/src/FluentNHibernate/Visitors/ValidationVisitor.cs) पर है लेकिन मैंने मास्टर शाखा से संस्करण का परीक्षण नहीं किया है, इसलिए मैं हूं सुनिश्चित नहीं है कि यह पहले से ही सही है (बस अनुमान लगाएं)। मुझे नहीं पता कि एक MapClass के लिए सत्यापन को अक्षम कैसे करें लेकिन केवल दो सत्यापन हैं। अवांछित एक और जांचें कि आईडी मैप किया गया है या नहीं। मैं दोनों के बिना खुशी से रहूँगा :)। –

+0

मैं क्या हो रहा है, यह गलतफहमी हो सकता है, लेकिन ऐसा लगता है कि मास्टर शाखा पुरानी है, इसमें 2.1 की कमी है। मुझे किसी भी शाखा में इस मुद्दे को ठीक नहीं दिख रहा है। –

6

यह धाराप्रवाह NHibernate 2.1 का सत्यापन/रिश्तों की जोड़ी के साथ एक मुद्दा है। एफएनएच pairs up relationships और फिर validates that only one side of the relationship has .Inverse() specified। चूंकि दोनों संदर्भ (माता-पिता/बच्चे) एक ही कक्षा में हैं, वे जोड़ते समय दोनों उम्मीदवार मैच होते हैं। उस स्थिति में, एफएनएच matches on name similarity। नतीजतन, वे प्रत्येक एक दूसरे के बजाय खुद के साथ जोड़ा जाता है। तो फिर .Inverse() को किसी भी पर वैधता ट्रिगर करता है (जोड़ी के दोनों किनारे एक ही रिश्ते हैं जो उलटा है)।

FluentMappingsContainer पर OverrideBiDirectionalManyToManyPairing() विधि का उपयोग करके इसे सही करना संभव होना चाहिए। सिद्धांत रूप में, यह आपको स्पष्ट रूप से बच्चे और माता-पिता संबंधों को जोड़ने की अनुमति देगा। हालांकि, एफएनएच 2.1 में एक बग है, और ओवरराइड कॉलबैक कभी नहीं कहा जाता है। (The callback value is captured before it can be set by the method)।

आसपास के काम के रूप में, आप एफएनएच में सभी सत्यापन अक्षम कर सकते हैं। only two validations हैं। सबसे पहले, रिश्ते के दोनों तरफ .Inverse() नहीं है। दूसरा, कि प्रत्येक इकाई पर एक आईडी मैप किया गया है। स्पष्ट तरीका मैं सत्यापन निष्क्रिय करने के लिए मिल गया है है:

.Mappings(m => { 
    var persistenceModel = new PersistenceModel() { ValidationEnabled = false }; 
    m.UsePersistenceModel(persistenceModel) 
    .FluentMappings.AddFromAssemblyOf<Category>(); 
}) 

यह दृष्टिकोण आप सत्यापन निष्क्रिय करने के लिए अनुमति देता है, लेकिन अभी भी FluentMappings विन्यास का पूरा अभिव्यक्ति का उपयोग करें।

+0

हां, लेकिन मुझे लगता है कि किसी भी अन्य त्रुटियों को दबाया जाएगा, जो बिना किसी ध्यान के कक्षा मैपिंग में किसी भी भविष्य में बदलाव के लिए समस्याग्रस्त साबित हो सकता है? –

+0

अच्छी तरह से देखा गया! मैं (जाहिर है) इस परिदृश्य पर विचार नहीं किया। मैंने इसके लिए [एक मुद्दा] बनाया है (http://fluentnhibernate.lighthouseapp.com/projects/33236-fnh/tickets/212-inverse- validation-fails-on-self-referential-relationships) और हमारे पास होगा यह एएसपी सॉर्ट किया गया। –

+0

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

0

हाँ ऐसा लगता है कि यह एफएनएच में एक बग की संभावना है, क्योंकि मैंने इसे फ्लुएंट एनएच के बिना सीधे एनएचबीर्नेट के साथ करने की कोशिश की और यह काम किया।हालांकि, जैसा कि मैंने पहले से ही एफएनएच का उपयोग कर एक सिस्टम स्थापित किया था, मैं इसे उपयोग करने के लिए वापस नहीं लौटा सकता था।

मैंने जो किया वह कई-से-कई रिश्तों के लिए स्वयं को 'क्लास-इन-द-बीच' की तरह बनाया गया था, जो आमतौर पर स्वचालित रूप से जेनरेट होता है। मैंने ContentPage_ChildLink पृष्ठ बनाया, जिसने Parents और Children श्रेणियों को लिंक किया। इसने मुझे एफएनएच के साथ काम करने और समस्या के आसपास काम करने की अनुमति दी :)

असल में यह ContentPage_ChildLink में दो फ़ील्ड, ChildID और ParentID होंगे। मैं बिना किसी समस्या के, 'व्यस्त' संबंधों को अलग-अलग सेट कर सकता था।

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

+0

हमारे पास स्थिति बैंक खाते हैं जहां कुछ खाते बंद हैं और पैसा अन्य खातों में घुमाया जाता है। यह खाते से खाते में कई से कई बनाता है। –

+0

आपको बग के आसपास काम करने के लिए बैंक खातों को जोड़ने के लिए एक और कक्षा बनाने की आवश्यकता होगी। आपके पास 'खाता लिंक' श्रेणी हो सकती है, जिसमें 'MainAccountID' और 'LinkedAccountID' होगा। खाता लिंक में एक से अधिक संग्रह 'लिंक्डएक्शंस' होंगे जिनके पास एक-से-कई संबंध 'खाता लिंक' तालिका होगी। आप MainAccount.LinkedAccounts [0] करके रिश्ते को पार कर सकते हैं। लिंक्ड अकाउंट। आशा करता हूँ की ये काम करेगा ! –

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