2013-07-30 16 views
24

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

मैं क्या सोच रहा था कि अगर कोई ऐसा तरीका है जो मैं कर सकता हूं, या तो कुकी या किसी अन्य विधि के आधार पर जो कि वे किस कंपनी को कनेक्ट करना चाहते हैं, फ़िल्टर को फ़िल्टर करके अपने इनपुट के आधार पर इकाई फ्रेमवर्क लक्ष्य डेटाबेस को गतिशील रूप से बदलते हैं ?

यहाँ एक उदाहरण है:

साइट, उपलब्ध कंपनियों के साथ पृष्ठ लोड है कि उपयोगकर्ता पहुँच की अनुमति है करने के लिए उपयोगकर्ता एक लॉग, उपयोगकर्ता तो एक कंपनी का चयन करेंगे, वे कहते हैं कि कंपनी में व्यवस्थापक विशेषाधिकार है, वे जोड़ने एक कर्मचारी, उस क्रिया से पहले चलाया जाता है, asp.net कनेक्शन स्ट्रिंग को उचित डेटाबेस में स्विच करेगा, फिर रिकॉर्ड जोड़ें।

+0

पर सबसे आप 2 संदर्भों के साथ खत्म हो जाएगा, या वहाँ कुछ समाधान लेकिन बहुत कम व्यावहारिक और EF6 कई समर्थन करने के लिए आशा की जाती है डेटाबेस। जब आप अपना ऐप तैयार करेंगे, तब तक आप बीटा की जांच कर सकते हैं, ईएफ 6 जारी किया जाएगा। लेकिन यह सभी डीबी एक संगठन का हिस्सा हैं, फिर उन्हें कंपनीआईडी ​​के लिए अतिरिक्त विदेशी कुंजी के साथ विलय करने से एक डीबी बन जाएगी और रिपोर्टिंग आसान हो जाएगी। –

+1

आह मैं देखता हूं, समस्या यह है कि जिस व्यक्ति ने पहली पेरोल प्रणाली बनाई है, वह डेटाबेस संरचना को समान रखने के बारे में बहुत ही अशिष्ट है, इसलिए वह कहता है कि कंपनियां नए संस्करण में अपग्रेड करने के इच्छुक होंगी अगर वे ' किसी भी डेटाबेस माइग्रेशन करने की जरूरत नहीं है। – ChaoticLoki

+0

वैसे यह रखरखाव दुःस्वप्न है, आप जुड़ने के साथ पार डीबी प्रश्नों को करने में सक्षम नहीं होंगे। मुझे ईएफ 6 के बारे में निश्चित नहीं है लेकिन आप कोडेप्लेक्स पर देख सकते हैं। –

उत्तर

5

ईएफ 6 के समान संदर्भ से कई डीबी एक्सेस के लिए बेहतर समर्थन है। यहां ईएफ 5 से एक स्निपेट है। पहले डाटाबेस प्रारंभकर्ता सेटिंग का प्रबंधन करना महत्वपूर्ण है। आप किसी भी माइग्रेशन को ट्रिगर नहीं करना चाहते हैं। यानी, लेकिन सवाल का जवाब देने से पहले

Database.SetInitializer(new ContextInitializerNone<MyDbContext>());

इस का उपयोग करें: हाँ आप कर सकते हैं

var conn = GetSqlConn4DbName(dataSource,dbName); 
var ctx = new MyDbContext(conn,true); 



public DbConnection GetSqlConn4DbName(string dataSource, string dbName) { 
     var sqlConnStringBuilder = new SqlConnectionStringBuilder(); 
     sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource; 
     sqlConnStringBuilder.IntegratedSecurity = true; 
     sqlConnStringBuilder.MultipleActiveResultSets = true; 

     var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString); 
     var sqlConn = sqlConnFact.CreateConnection(dbName); 
     return sqlConn; 
    } 


public class ContextInitializerNone<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) { } 
} 

Also see StackOverflow answer using migration, sample code, and dynamic db connection

22

यह बहुत सरल है। मेरे पास है:

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in  web.config also the name of Entitiframework 
{ 
} 
edmx फ़ोल्डर

का स्वत: जनरेट की Model.Context.cs में

पहले से ही क्रम में एक से अधिक डेटाबेस से कनेक्ट करने के लिए, मैं एक निर्माता है कि एक ही फाइल मॉडल में नीचे की तरह पैरामीटर के रूप में कनेक्शन स्ट्रिंग लेता बनाया। Context.cs

public WMSEntities(string connStringName) 
    : base("name=" + connStringName) 
{ 
} 

अब मैं उदाहरण के लिए web.config में अन्य कनेक्शन स्ट्रिंग जोड़ा

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/> 

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/> 

तब, जब डेटाबेस से कनेक्ट मैं विधि नीचे फोन पैरामीटर के रूप में connetionString नाम गुजर

public static List<v_POVendor> GetPOVendorList(string connectionStringName) 
{ 
    using (WMSEntities db = new WMSEntities(connectionStringName)) 
    {    
     vendorList = db.v_POVendor.ToList();     
    } 
} 
+0

हाय पर एक नज़र डालेगा, यह बहुत अच्छा लगता है .... मेरी क्वेरी है, अगर यह कोई डेटाबेस मॉडल बदलता है, तो यह कैसे प्रभावित होगा। यह रखरखाव दुःस्वप्न होगा? – niku

+0

हम मॉडल.cs फ़ाइल को पुन: उत्पन्न करते हैं, फिर से हमें कॉन्फ़िगरेशन 'सार्वजनिक WMSEntities (स्ट्रिंग connStringName) : आधार ("name =" + connStringName) { } ' –

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