2013-01-21 8 views
17

के लिए सेटअप इकाई फ्रेमवर्क मैं एक ऐप पर काम कर रहा हूं जो एकाधिक डेटाबेस में एक ही डेटाबेस स्कीमा का उपयोग करेगा। इस कारण से, मैंने MyTemplate नामक डेटाबेस बनाया है। जब कोई नया उपयोगकर्ता बनाया जाता है, तो उनके पास डेटाबेस का अपना उदाहरण होगा। इसलिए, MyTemplate_[UserName] जैसे कुछ डेटाबेस को बनाया जाएगा। जब कोई उपयोगकर्ता लॉग इन करता है, तो मुझे अपने प्रश्नों को उनके डेटाबेस में इंगित करने की आवश्यकता होती है। इस कारण से, मुझे पता है कि मुझे रनटाइम पर कनेक्शन स्ट्रिंग सेट करने की आवश्यकता है। मेरी समस्या यह है कि मैं भी इकाई फ्रेमवर्क का उपयोग करना चाहता हूं।गतिशील कनेक्शन स्ट्रिंग

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

string connectionString = GetUsersConnectionString(); 
using (TemplateEntities entities = new TemplateEntities()) 
{ 
    TemplateEntity entity = new TemplateEntity(); 

    // Save to the database 
    entities.TemplateEntity.Add(entity); 
    entities.SaveChanges(); 
} 

क्या मैं .edmx गलत तरीके से बना रहा हूं? या क्या मैं पूरी तरह से कुछ याद कर रहा हूँ? मैं जो कुछ भी Google Google को एक अधिभार दिखाता हूं जिसे कनेक्शन स्ट्रिंग को पारित करने की अनुमति देनी चाहिए। हालांकि, मेरे पास उस अधिभार को उपलब्ध नहीं है।

उत्तर

30

उत्पन्न TemplateEntities वर्ग partial के रूप में चिह्नित किया गया है।

partial class TemplateEntities 
{ 
    public TemplateEntities(string nameOrConnectionString) 
    : base(nameOrConnectionString) 
    { 
    } 
} 

फिर इस निर्माता के लिए अपने कनेक्शन स्ट्रिंग पारित:

आपको बस इतना करना है आंशिक वर्ग परिभाषा यह है कि निर्माता का उपयोग करना चाहते को उजागर करता है के दूसरे भाग के साथ एक और फ़ाइल जोड़ने है।

आप इस कोड को एक अलग फ़ाइल में रखना चाहते हैं, इसलिए जब आप अपना एडीएमएक्स मॉडल अपडेट करते हैं तो यह अधिक लिखित नहीं होता है।

+2

जब मैं ऐसा करता हूं, तो मुझे एक त्रुटि मिलती है जो कहती है: 'ऑब्जेक्ट' में कोई कन्स्ट्रक्टर नहीं होता है जो 1 तर्क लेता है। मैं क्या गलत कर रहा हूं? – user70192

+3

नए कन्स्ट्रक्टर के साथ आंशिक श्रेणी परिभाषा जेनरेट क्लास के समान नामस्थान में होनी चाहिए - अन्यथा यह एक नई कक्षा घोषित करता है (जिसे डिफ़ॉल्ट रूप से 'ऑब्जेक्ट' से प्राप्त होता है) –

+0

+1: मैं इस प्रकार का कन्स्ट्रक्टर क्यों परेशान हूं डिफ़ॉल्ट टेम्पलेट में नहीं, लेकिन यह एक अच्छा और साफ समाधान है, thx। – reSPAWNed

13

निकोलस बटलर का जवाब काफी सही है। उन्होंने जो कहा, उसके अलावा, मुझे इकाई ढांचे के लिए मौजूदा कनेक्शन स्ट्रिंग लेने की समस्या का सामना करना पड़ा और बस इसे एक अलग डेटाबेस पर इंगित करना था जिसमें एक ही संरचना थी। मैंने मौजूदा स्ट्रिंग के केवल डेटा स्रोत को बदलने के लिए निम्न कोड का उपयोग किया:

var originalConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CSName"].ConnectionString; 
var ecsBuilder = new EntityConnectionStringBuilder(originalConnectionString); 
var sqlCsBuilder = new SqlConnectionStringBuilder(ecsBuilder.ProviderConnectionString) 
{ 
    DataSource = "newDBHost" 
}; 
var providerConnectionString = sqlCsBuilder.ToString(); 
ecsBuilder.ProviderConnectionString = providerConnectionString; 

string contextConnectionString = ecsBuilder.ToString(); 
using (var db = new SMSContext(contextConnectionString)) 
{ 
    ... 
} 
+0

यह कक्षाएं 'EntityConnectionStringBuilder & SqlConnectionStringBuilder' डॉटनेट अंतर्निर्मित कक्षा हैं या आपके द्वारा लिखी गई हैं? –

+0

@MonojitSarkar वे .NET कक्षाएं हैं, जो मेरे द्वारा लिखे गए नहीं हैं। यह इसकी सुंदरता है। :-) –