7

मेरे पास Patient नामक इकाई इकाई है और इस इकाई में Visits नामक एक संपत्ति है जो VisitsCollection प्रकार है।NHibernate कस्टम संग्रह प्रकार

VisitsCollectionsIList<Visit> का एक बाल वर्ग है लेकिन यह संग्रह में कुछ कस्टम तर्क भी जोड़ता है (जैसे ऑटो ऑर्डरिंग, कुछ सत्यापन, अधिसूचनाएं, आदि ..)।

I कस्टम संग्रह प्रकार का उपयोग करने के लिए की आवश्यकता है क्योंकि यह संग्रह में जोड़े गए इकाइयों को कुछ डेटा जोड़ता है और पारदर्शी रूप से कुछ अन्य कागजी कार्य करता है।

अब मैं मैप करने के लिए है कि NHibernate में चाहते हैं, तो मैं बना लिया है:

<list name="Visits" lazy="true" fetch="select"> 
    <key foreign-key="PatientId" /> 
    <index column="Timestamp" /> 
    <one-to-many class="Visit" not-found="ignore"/> 
</list> 

मैं एक अपवाद हो रही है:

प्रकार के 'NHibernate.Collection वस्तु कास्ट करने में असमर्थ। PersistentList 'टाइप करने के लिए' ... विज़िटकोलेक्शन '

जब भी मैं विज़िट प्रॉपर्टी एक्सेस कर रहा हूं।

मैं भी यह इस तरह से मैप करने के लिए कोशिश की है:

<list name="Visits" lazy="true" fetch="select" collection-type="VisitsCollection"> 
    <key foreign-key="PatientId" /> 
    <index column="Timestamp" /> 
    <one-to-many class="Visit" not-found="ignore"/> 
</list> 

लेकिन अभी भी, मैं इस अपवाद हो रही है:

कस्टम प्रकार UserCollectionType को लागू नहीं करता है: ..... VisitsCollection

मैं के रूप में संग्रह वर्ग एक रूपरेखा है कि मैं इसे दाल-agnos होना चाहता हूँ का हिस्सा है किसी भी NHibernate प्रकार से मेरी VisitsCollection वारिस नहीं करना चाहते टिक (क्योंकि यह कई परिदृश्यों में उपयोग किया जाएगा - न केवल डेटाबेस के साथ)।

मेरे कोड की संरचना को संरक्षित करने के तरीके पर कोई विचार नहीं है?

अग्रिम धन्यवाद।

उत्तर

6

मैं कस्टम संग्रह प्रकारों का कभी भी उपयोग नहीं करता, मुख्य रूप से क्योंकि मैं आलसी हूं। NHibernate चाहता है कि आप एक IUserCollectionType का उपयोग करें, मुझे विश्वास है, जिसके लिए कुछ नलसाजी की आवश्यकता होती है।

इसके बजाय, मेरा पहला स्टॉप एक्सटेंशन विधियों का उपयोग discussed by Billly McCafferty के रूप में करना होगा। लेकिन आपके पास कोड लिखा गया है ...

वैकल्पिक रूप से, आप discussed here by Colin Jack के रूप में अपने संग्रह को एक घटक के रूप में मानचित्रित कर सकते हैं। यह आपके परिदृश्य के लिए आसान हो सकता है?

यह भी देखें SO thread

1

मैं भी कस्टम संग्रह का उपयोग न करने के लिए वोट देता हूं। वैसे भी, आप इसे घटक के माध्यम से कर सकते हैं।

<component name="Warehouses" class="Core.Domain.Collections.EntitySet`1[Core.Domain.OrgStructure.IWarehouseEntity,Core],Core"> 
<set name="_internalCollection" table="`WAREHOUSE`" cascade="save-update" access="field" generic="true" lazy="true" > 
    <key column="`WarehouseOrgId`" foreign-key="FK_OrgWarehouse" /> 
    <!--This is used to set the type of the collection items--> 
    <one-to-many class="Domain.Model.OrgStructure.WarehouseEntity,Domain"/> 
</set> 

How to map NHibernate custom collection with fluentNHibernate?

0

बस संदर्भ के लिए, यहाँ आप यह कैसे FluentNHibernate

एक अलग विषय IMHO

का उपयोग कर हम या एक कस्टम संग्रह प्रकार नहीं बनाना चाहिए चाहिए या नहीं है कर सकता है
public class PatientOverride : IAutoMappingOverride<Patient> 
{ 
     public void Override(AutoMapping<Patient> mapping) 
     { 
      mapping.Component(
       x => x.Visits, 
       part => 
       { 
        part.HasMany(Reveal.Member<VisitsCollection, IEnumerable<Visit>>("backingFieldName")) // this is the backing field name for collection inside the VisitsCollection class 
        .KeyColumn("PatientId") 
        .Inverse(); // depends on your use case whether you need it or not 
       }); 
     } 
} 
संबंधित मुद्दे