8

में नेमस्पेस द्वारा मैपिंग कैसे जोड़ें मेरे आवेदन में, मुझे एकाधिक डेटाबेस से बात करने की आवश्यकता है। मैं एनएचबीर्नेट में एक सत्र फैक्टरी प्रति डेटाबेस बनाकर इसे संभालने में काम कर रहा हूं (मुझे लगता है कि यह करने के लिए यह सही बात है)। तो मेरे पास मॉडल के दो सेट (एक डेटाबेस प्रति) हैं, और फ्लुएंट एनएचबेर्नेट ClassMap<> मैपिंग के दो सेट हैं। दोनों एक ही प्रोजेक्ट में हैं (नेमस्पेस से अलग) और मैं इसे इस तरह से रखना चाहता हूं।Fluent NHibernate

सत्र फ़ैक्टरी बनाने के दौरान समस्या आती है।

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserClassMap>()) 
    .Mappings(m => m.FluentMappings.Add<UserClassMap>() 

अगर मैं पहले अधिभार का उपयोग करें, तो मेरे सत्र कारखानों दोनों डेटाबेस के लिए सभी मैपिंग मिल: जहाँ तक मैं देख सकता हूँ, धाराप्रवाह NHibernate मूल रूप से मैपिंग जोड़ने के लिए दो तरीकों है। अगर मैं दूसरे का उपयोग करता हूं, तो मुझे प्रत्येक व्यक्तिगत क्लासमैप निर्दिष्ट करना होगा। मुझे कुछ FluentMappings.AddFromNamespace() पसंद है। क्या इसे करने का कोई तरीका है?

उत्तर

16

ऐसा नहीं है कि FluentNHibernate automapping के लिए फ़िल्टरिंग के इस प्रकार का समर्थन करता है, लेकिन ClassMap रों के लिए नहीं अजीब है। विस्तारित तरीकों के जादू के माध्यम से, हालांकि, इस सुविधा को स्वयं जोड़ना बहुत कठिन नहीं होना चाहिए। इस प्रयास करें:

public static FluentMappingsContainer AddFromAssemblyOf<T>(
    this FluentMappingsContainer mappings, 
    Predicate<Type> where) 
{ 
    if (where == null) 
     return mappings.AddFromAssemblyOf<T>(); 

    var mappingClasses = typeof(T).Assembly.GetExportedTypes() 
     .Where(x => (typeof(IMappingProvider).IsAssignableFrom(x) 
       || typeof(IExternalComponentMappingProvider).IsAssignableFrom(x)) 
      && where(x)); 

    foreach (var type in mappingClasses) 
    { 
     mappings.Add(type); 
    } 

    return mappings; 
} 

... और इस तरह इसका इस्तेमाल:

m.FluentMappings.AddFromAssemblyOf<UserClassMap>(t => t.Namespace.StartsWith("One.Of.The.Two.Namespaces")); 
+0

+1 मैंने कुछ इसी तरह की खोज की, लेकिन यह दृष्टिकोण अधिक सामान्य है। –

+1

यह SubClassMaps को मानचित्र नहीं करता है, क्योंकि वे IMappingProvider से असाइन नहीं किए जा सकते हैं। http: // stackoverflow।कॉम/ए/6207141/206297 में मैपिंगप्रोवाइडर की विस्तारित सूची है जिसे चेक किया जाना चाहिए। – ngm

0

ऐसा करने का कोई तरीका नहीं है। मैं नेमस्पेस को अलग-अलग परियोजनाओं में अलग करने की सलाह देता हूं। याद रखें:

अलग-अलग नामस्थान, लॉजिकल अलगाव के दौरान एक ही प्रोजेक्ट समझ में आता है। पृथक नामस्थान, अलग-अलग परियोजनाएं जब भौतिक अलगाव समझ में आता है।

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

0
... AutoMap.AssemblyOf<Person>().Where(x => x.Namespace.EndsWith("Domain")) ... 
+0

मैं ऑटोमैपिंग का उपयोग नहीं कर रहा हूं, मैं क्लासमैप <> मैपिंग के साथ स्पष्ट रूप से अपने मैपिंग निर्दिष्ट कर रहा हूं। –

10

मैं एक विस्तार विधि है कि मेरे लिए यह करता है लेखन को बंद कर। असल में यह उन सभी प्रकारों पर पुनरावृत्ति का उपयोग करता है जिनमें मुझे रूचि है, और उन्हें एक-एक करके जोड़ें। यह AddFromAssemblyOf के कार्यान्वयन पर आधारित है। उपयोग:

.Mappings(m => m.FluentMappings.AddFromNamespaceOf<UserClassMap>()) 

कार्यान्वयन:

public static class FluentNHibernateExtensions 
{ 
    public static FluentMappingsContainer AddFromNamespaceOf<T>(
     this FluentMappingsContainer fmc) 
    { 
     string ns = typeof(T).Namespace; 
     IEnumerable<Type> types = typeof(T).Assembly.GetExportedTypes() 
      .Where(t => t.Namespace == ns) 
      .Where(x => IsMappingOf<IMappingProvider>(x) || 
         IsMappingOf<IIndeterminateSubclassMappingProvider>(x) || 
         IsMappingOf<IExternalComponentMappingProvider>(x) || 
         IsMappingOf<IFilterDefinition>(x)); 

     foreach(Type t in types) { 
      fmc.Add(t); 
     } 

     return fmc; 
    } 

    /// <summary> 
    /// Private helper method cribbed from FNH source (PersistenModel.cs:151) 
    /// </summary> 
    private static bool IsMappingOf<T>(Type type) 
    { 
     return !type.IsGenericType && typeof(T).IsAssignableFrom(type); 
    } 
} 

चेतावनियां:

  • नाम के बाद से यह सिर्फ एक ही विधानसभा खोज करता है, एक छोटे से भ्रामक है। इसे शायद AddFromAssemblyAndNamespaceOf कहा जाना चाहिए, लेकिन यह थोड़ा वर्बोज़ है।
  • यह पूरी तरह से भविष्य के सबूत नहीं है। यदि एफएनएच के भविष्य के संस्करण कुछ मैपेबल इंटरफेस को जोड़ते या हटाते हैं, तो इसमें उन्हें शामिल नहीं किया जाएगा।

लेकिन यह मेरे उद्देश्यों के लिए काम करता है।

+0

+1 धन्यवाद, बहुत मददगार! –

+0

यह वही है जो मुझे चाहिए - धन्यवाद! यह सिर्फ एफएनएच में बनाया जाना चाहिए। –

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