2010-04-16 18 views
9

मेरी परियोजना को तीन डेटाबेस को संभालने की आवश्यकता है, जिसका अर्थ है तीन सत्र कारखानों। बात यह है कि अगर मैं धाराप्रवाह NHibernate के साथ कुछ इस तरह करते हैं:फ्लुएंट एनएचबेर्नेट + एकाधिक डेटाबेस

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 

कारखानों सभी मैपिंग लेने हैं, यहां तक ​​कि जो कि एक और डेटाबेस के अनुरूप

मैंने देखा है जब आप automapping का उपयोग कर कि नाम स्थान से कुछ इस तरह है, और फिल्टर कर सकते हैं:

.Mappings(m => m.AutoMappings.Add(
    AutoMap 
     .AssemblyOf<Product>() 
     .Where(t => t.Namespace == "Storefront.Entities"))) 

मैं नहीं किया धाराप्रवाह मैपिंग के लिए इस तरह कुछ भी पाया, यह संभव है ?? एकमात्र समाधान जो मैं सोच सकता हूं वे हैं: या तो प्रत्येक डीबी मैपिंग कक्षाओं के लिए अलग-अलग असेंबली बनाएं या स्पष्ट रूप से प्रत्येक इकाई को फैक्टरी कॉन्फ़िगरेशन में जोड़ दें।

यदि संभव हो तो मैं दोनों से बचना पसंद करूंगा। धन्यवाद।

+2

मैं इस उदाहरण में प्रति डेटाबेस एक मैपिंग असेंबली की सलाह दूंगा। यह चिंताओं का एक अच्छा अलगाव है और किसी अन्य डेवलपर को समझने के लिए आसान होना चाहिए। –

+0

ऐसा लगता है कि मुझे सभी एंटीटी वर्गों को किसी अन्य प्रोजेक्ट और दूसरे डीबी के लिए अन्य प्रोजेक्ट में रखना होगा। – CallMeLaNN

उत्तर

5

मैं हुक्म को जो DB इकाई में अंतर्गत आता है वास्तव में इस का उपयोग करते हुए (मेरे अपने) Fluent मैपिंग फ़ाइल पर गुण क्रियान्वित किया है। मैं यह भी की एक अवधारणा मिल गया है एक 'डिफ़ॉल्ट' डेटाबेस, और विशेषता के बिना मैपिंग फ़ाइलों को डिफ़ॉल्ट डीबी में रहने के लिए माना जाता है (यह उन वर्गों की संख्या पर कटौती कर सकता है जिन्हें आपको सजाने के लिए आवश्यक है)। मेरे पास प्रारंभिक कोड है जो डेटाबेस प्रति सत्र फैक्ट्री बनाता है, और प्रत्येक के लिए, सभी क्लासमैप कक्षाओं को खोजने के लिए प्रतिबिंब का उपयोग करता है, यह निर्धारित करने के लिए विशेषता का परीक्षण करता है कि यह कौन सा डीबी है, और उसके अनुसार प्रत्येक क्लासमैप को पंजीकृत करता है।

एक मैपिंग फ़ाइल उदाहरण:

[FluentNHibernateDatabase("MySecurityDatabase")] 
    public class SystemUserMap : ClassMap<SystemUser> 
    { 
    public SystemUserMap() 
    { 
     Id(x => x.SystemUserId); 
     Map(x => x.LoginId); 
     Map(x => x.LoginPassword); 
     Map(x => x.UserFirstName); 
     Map(x => x.UserSurname); 
     References(x => x.UserOrganisation, "OrganisationId"); 
    } 
    } 

जाहिर है मैं डीबीएस कि संदर्भित/उपयोग किया जाता है की एक सूची परिभाषित किया है।
मेरे कार्यान्वयन अब तक के रूप में मैं इसे कर लिया है काम करता है, लेकिन मैं कोई समस्या हुई है (मुझे आशा है कि किसी के साथ मदद कर सकते हैं): How to identify a particular entity's Session Factory with Fluent NHibernate and Multiple Databases

+3

इस परिदृश्य में, आप विशेषता का उपयोग कहां कर रहे हैं? मुझे पता है कि यह मैपिंग कॉन्फ़िगरेशन में होगा, लेकिन किसी भी मौके पर आप अपने कार्यान्वयन के बारे में अधिक जानकारी दे सकते हैं? धन्यवाद! – reallyJim

+0

FluentNHibernateDatabase विशेषता कहां है और आप Fluently को कैसे परिभाषित करते हैं। कॉन्फ़िगर करें()? – CallMeLaNN

+0

विशेषता मेरा है और मैं डीबी की पहचान करने के लिए इसका उपयोग करता हूं कि एक विशेष वर्ग को पंजीकृत होना चाहिए (विशेषता का पैरामीटर वह नाम है जिसे मैंने अपने डीबी को दिया है)। मैंने इस तरह कार्यान्वित किया है कि मेरे पास 'डिफ़ॉल्ट' डीबी है, और उस डीबी में इकाइयों से संबंधित सभी मानचित्र फ़ाइलों को विशेषता की आवश्यकता नहीं है (या, विपरीत: विशेषता के बिना सभी मानचित्र फ़ाइलों का उद्देश्य माना जाता है डिफ़ॉल्ट डीबी)। – Trevor

1

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

यह अच्छा होगा अगर एफएनएच बहु-डीबी समर्थन में कुछ प्रकार का निर्माण प्रदान कर सके लेकिन मुझे नहीं पता कि वास्तव में यह कैसे किया जा सकता है; सत्र कारखानों के कुछ प्रकार का शब्दकोश हो सकता है लेकिन हर स्थिति सिर्फ इतना अनोखी है।

HTH,
Berryl

/// <summary> 
    /// This would simply call <see cref="AutoMapHelpers.GetAutoMappingFilter"/> but we need to 
    /// exclude <see cref="LegacyProject"/> also for now. 
    /// </summary> 
    private static bool _getIncludedTypesFilter(Type t) { 
     return _isNotLegacy(t) && AutoMapHelpers.GetAutoMappingFilter(t); 
    } 
    private static bool _isNotLegacy(Type t) { return !t.Equals(typeof(LegacyProject)); } 
4

:

मैं अपने सवाल यहाँ कहा है ऐसा करने का आसान तरीका तो स्कीमा

में डेटाबेस नाम डाल करने के लिए है, बशर्ते सभी तालिकाओं में एक ही कनेक्शन स्ट्रिंग पर जाया जा सकता है, आप केवल एक सत्र कारखाने की जरूरत

0

हालांकि यह बहुत देर से प्रतिक्रिया है, लेकिन मैं आपको निम्नलिखित यूआरएल से गुजरने का सुझाव देता हूं, जिसका असर हल करने के लिए कुछ समाधान है और इसलिए आप जवाब में समाधान पा सकते हैं। Here अपने जवाब का हल जो url

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

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