9

मेरे पास निम्नलिखित परिदृश्यप्रति वर्ग वर्ग को तालिका कैसे प्राप्त करें जब आधार वर्ग धाराप्रवाह निबर्ननेट में सार है?

public abstract class BaseClass 
{ 
    public virtual int Id {get; set}; 
    public virtual string Name {get; set;} 
} 

public class FirstSubClass : BaseClass 
{ 
    //properties and behaviour here 
} 

public class SecondSubClass : BaseClass 
{ 
    //properties of SecondSubclass Here 
} 

public class ProcessStep 
{ 
    public virtual IList<BaseClass> ContentElements {get; set;} 
} 

मैपिंग के लिए है, मैंने निम्नलिखित कोड स्निपेट का उपयोग किया है: -

this._sessionFactory = 
          Fluently.Configure().Database(SQLiteConfiguration.Standard 
          .ConnectionString(@"Data Source=SqliteTestSqlDataAccess.s3db; Version=3; New=True; Pooling=True; Max Pool Size=1;")) 
          .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(assemblyWithDomainClasses).Conventions.Add(DefaultCascade.All()))) 
          .ExposeConfiguration(BuildSchema) 
          .BuildSessionFactory(); 

डिफ़ॉल्ट धाराप्रवाह बेसबैस के सार बेस क्लास को अनदेखा कर देगा। लेकिन क्लास प्रोसेसस्टेप के रूप में संपत्ति ContentElements है जो IList लौटाता है, मुझे अपवाद मिल रहा है: - NHibernate.MappingException: एसोसिएशन संदर्भ अपरिवर्तित वर्ग: बेसक्लास

यदि मैं IncludeBase का उपयोग कर बेस क्लास शामिल करता हूं (टाइपऑफ (बेस क्लास)) तो यह ठीक काम करता है लेकिन यह बेस क्लास और व्युत्पन्न कक्षाओं के लिए एक टेबल बनाता है और रिकॉर्ड एफके-पीके रिलेशनशिप ( तालिका प्रति subclass) से जुड़े होते हैं। मैं जो हासिल करना चाहता हूं वह तालिका प्रति कंक्रीट वर्ग है। प्रत्येक व्युत्पन्न वर्ग में इसकी अपनी तालिका होगी जहां बेस क्लास में व्युत्पन्न कक्षा + गुणों के सभी गुण होंगे। कोई विचार यह कैसे प्राप्त करें?

उत्तर

9

चूंकि मैंने आपके मानचित्रण को नहीं देखा है, तो मुझे मेरा प्रदान करने दें। आप इस

public class BaseClassMap:ClassMap<BaseClass> 
{ 
    public BaseClassMap() 
    { 
     /* 
     * Identity generator can't be native because subclass objects should be unique 
     * So use HiLo or Guid or other generators which will generate unique id on the child tables 
     */ 
     Id(x => x.Id).GeneratedBy.Guid(); 
     Map(x => x.Name); 
     UseUnionSubclassForInheritanceMapping(); // This is important - uses union-subclass mappings for the derived classes 
    } 
} 

public class FirstSubClassMap : SubclassMap<FirstSubClass> 
{ 
    public FirstSubClassMap() 
    { 
     Table("FirstSubClassTable"); 
     // Map properties for FirstSubClass 
    } 
} 

public class SecondSubClassMap : SubclassMap<SecondSubClass> 
{ 
    public SecondSubClassMap() 
    { 
     Table("SecondSubClassTable"); 
     // Map properties for SecondSubClass 
    } 
} 
+1

मैं उपयोग कर रहा हूँ ऑटोमैपिंग इसलिए, मेरे पास कक्षाओं को अलग से मैप करने के प्रावधान नहीं हैं। – Niraj

+0

आप कस्टम मैपिंग के साथ ऑटोमैपिंग को मिश्रित कर सकते हैं, ताकि आप केवल विशिष्ट वर्गों के लिए मैपिंग प्रदान कर सकें, बाकी वर्गों को ऑटोपैपिंग का उपयोग करके मैप किया जा सकता है। कुछ कुछ इस तरह की तरह। कॉन्फ़िगर (कॉन्फ़िगरेशन)। मैपिंग्स (cfg => {cfg.AutoMappings.Add (....); cfg..FluentMappings.AddFromAssembly (आपकी कस्टम मैपिंग असेंबली);}) – Rajeesh

0

की तरह कार्य करके इस लक्ष्य को हासिल कर सकता है यह वजह से मुझे "कंक्रीट कक्षा प्रति तालिका" nhibernate automapping साथ एक सार आधार वर्ग के साथ विरासत रणनीति लागू करने के लिए सिर में दर्द। लेकिन मुझे लगता है, मुझे अंततः एक समाधान मिला है और इसे आपके साथ साझा करना चाहता हूं। मुझे यह भी लगता है कि यह ऑटोमैपिंग दस्तावेज़ों में नहीं जोड़ा गया है, क्योंकि इसे शायद "कमजोर" डेटाबेस डिज़ाइन के रूप में माना जा सकता है। (! Automapping) धाराप्रवाह NHibernate में विरासत रणनीतियों में से

  • https://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat उदाहरण कार्यान्वयन:

    यहाँ पहले कुछ संसाधनों मैं इस विषय के बारे में पाए जाते हैं।

  • https://github.com/jagregory/fluent-nhibernate/wiki/Automapping-inheritance स्वैपिंग के साथ धाराप्रवाह निबर्ननेट में विरासत रणनीतियों का दस्तावेज़ीकरण।
  • (कोई अन्य लिंक नहीं जोड़ सकता) https: // github। com/jagregory/धाराप्रवाह-nhibernate/खींच/25/करता है/2984c8c4e89aa4cec8625538f763c5931121a4e7 बग-फिक्स संघ-उपवर्ग कार्यान्वयन (कंक्रीट कक्षा प्रति तालिका)

इन संसाधनों मूल रूप से वर्णन कैसे आप इसे क्या करने की जरूरत:

  1. जैसा कि आपने पहले ही उल्लेख किया है कि धाराप्रवाह निबर्ननेट अमूर्त आधार वर्गों को अनदेखा करता है। तो आपको उन्हें स्पष्ट रूप से जोड़ना होगा।
// abstractBaseTypes is just a simple enumeration of base types 
// model is the AutoPersistenceModel 
abstractBaseTypes.ForEach(m => model = model.IncludeBase(m)); 
  1. क) आप संकलन समय पर सार आधार प्रकार जानते हैं कि आप उपयोग कर सकते हैं
//sets the union subclass strategy for the known base model 
model.Override<SuperType>(m => m.UseUnionSubclassForInheritanceMapping())) 
  1. ख) आप ठोस प्रकार नहीं जानते, तो आप प्रत्येक आधार प्रकार के लिए एक मानचित्रण ओवरराइड बना सकते हैं:
public class AbstractRightEntryMappingOverride : IAutoMappingOverride<AbstractRightEntry> 
{ 
    public void Override(AutoMapping<AbstractRightEntry> mapping) 
    { 
     mapping.UseUnionSubclassForInheritanceMapping(); 
    } 
} 

// You need to tell nhibernate where to find the overriden mappings. 
// You simply can add the assemblies again. 
modelAssemblies.ForEach(a => model = model.UseOverridesFromAssembly(a)); 
संबंधित मुद्दे