2011-03-23 10 views
5

में कनेक्शनस्ट्रिंग नाम को ओवरराइड करने के लिए मैं एक बहु-किरायेदार Asp.Net MVC 3 वेब ऐप बना रहा हूं, और डीबी मॉडल के लिए पहले EF4.1 कोड का उपयोग कर रहा हूं।पहले EF4.1 कोड में, Web.config

विकास के लिए मैं App_Data में SqlServerCE उपयोग करने के लिए खुश हूँ, और उत्पादन के लिए यह एक कनेक्शन स्ट्रिंग के लिए 2008

कहो मेरी संदर्भ "MyModels" कहा जाता है Sql सर्वर पर आ जाएगा, डिफ़ॉल्ट कोड-पहले दिखता द्वारा Web.config में "MyModels" कहा जाता है। इसे App_Data में एक फ़ाइल का उपयोग करने के लिए कहा जा सकता है या SQL2008 में डेटाबेस तक पहुंचने के लिए बदला जा सकता है। अब तक सब ठीक है।

लेकिन बहु-किरायेदारी की वजह से, मैं एसक्यूएलसेवर फ़ाइल नाम किरायेदार की अनूठी आईडी से मेल खाता हूं (इसलिए ऐप_Data में "client_x.sdf", "client_y.sdf" होगा; एसक्यूएल सर्वर 2008 में अलग-अलग डेटाबेस होंगे)। मैं इन अलग-अलग डेटाबेस को निर्देशित करने का तरीका नहीं समझ सकता।

मैंने MyModels को डीबीकॉन्टेक्स्ट से विरासत में लाने और एक कनेक्शन स्ट्रिंग की आपूर्ति करने (वेब.कॉन्फिग में 'प्लेसहोल्डर' कॉन स्ट्रिंग और अद्वितीय आईडी के साथ "{clientId}" को प्रतिस्थापित करने का प्रयास किया है, और मैंने यह भी सेट करने का प्रयास किया है MyModels कन्स्ट्रक्टर में कनेक्शन स्ट्रिंग:

base.Database.Connection.ConnectionString = xxx; 

लेकिन यह कभी काम नहीं करता है। मैं हमेशा निम्न त्रुटि मिलती है:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

(यह पता चलता है कि यह अभी तक नहीं SqlServerCE उपयोग करने के लिए 'के लिए कॉन्फ़िगर' है, और इसलिए Sql सर्वर से कनेक्ट करने के मुझे लगता है कि कोशिश कर रहा है।!)

कोड, डाटाबेस ट्रेसिंग .Connection.ConnectionString को इस बिंदु पर Web.config से नहीं पढ़ा गया है, इसलिए मैं इसे खोज और प्रतिस्थापित नहीं कर सकता, और संभवतः, इसे बाद में पाइपलाइन में 'प्लेसहोल्डर' कॉन स्ट्रिंग द्वारा अधिलेखित किया जा रहा है।

मुझे लगता है कि यह काफी सरल होना चाहिए और मुझे बस 'हुक' नहीं मिल रहा है। क्या कोई मदद कर सकता है?

+0

मैंने इसे समझ लिया है, और ऐसा इसलिए है क्योंकि मैं थोड़ा गूंगा हूं। माफ़ कीजिये! मैं सिर्फ कनेक्शन होने के लिए कनेक्शनस्ट्रिंग सेट करने की कोशिश कर रहा था, Web.config से स्ट्रिंग, लेकिन मुझे वास्तव में इसे DbConnectionStringBuilder का उपयोग करके बनाने की आवश्यकता है। अगर मैं बिल्डर की कनेक्शनस्ट्रिंग प्रॉपर्टी को प्रतिस्थापित करता हूं, तो ईएफ कॉन स्ट्रिंग सेट करने के लिए बिल्डर का उपयोग करें, यह काम करता है। मैं हल करने के रूप में इसे चिह्नित करने के साथ कर सकता था, कृपया! –

+3

उत्तर के रूप में अपनी टिप्पणी की सामग्री लिखें और इसे स्वीकार करें। –

+0

लाडस्लाव मृन्का के अनुसार, यह आपके अपने प्रश्न का उत्तर देने के लिए बिल्कुल ठीक है।मुझे विश्वास है कि आपको अपने उत्तर को "उत्तर" के रूप में चिह्नित करने से पहले एक दिन या उससे भी पहले इंतजार करना होगा, लेकिन इसकी अनुमति है;) –

उत्तर

1

मैंने इसे समझ लिया है, और ऐसा इसलिए है क्योंकि मैं थोड़ा गूंगा हूं। माफ़ कीजिये! मैं सिर्फ कनेक्शन होने के लिए कनेक्शनस्ट्रिंग सेट करने की कोशिश कर रहा था, Web.config से स्ट्रिंग, लेकिन मुझे वास्तव में इसे DbConnectionStringBuilder का उपयोग करके बनाने की आवश्यकता है। अगर मैं बिल्डर की कनेक्शनस्ट्रिंग प्रॉपर्टी को प्रतिस्थापित करता हूं, तो ईएफ कॉन स्ट्रिंग सेट करने के लिए बिल्डर का उपयोग करें, यह काम करता है।

+2

मुझे एक ही त्रुटि मिल रही है। कोड का एक छोटा सा हिस्सा दिखाता है कि कौन सा हिस्सा स्ट्रिंग web.config बनाता है और इसे अन्यथा कैसे सेट किया जाए, यह मेरे लिए बहुत मददगार होगा। – jp2code

1

मुझे यकीन नहीं है कि यह आपकी समस्या का समाधान करने के लिए एक संभावित दृष्टिकोण है या नहीं। मेरा विचार है कि अपने डीबीकॉन्टेक्स्ट क्लास को तुरंत चालू करने के लिए एक स्थिर "फैक्ट्री" कक्षा बनाएं। कोड इस तरह है:

public static class MyModelsFactory 
{ 
    public static MyModels CreateMyModels() 
    { 
     string connectionString = string.Empty; 
     // some code to retrieve your connectionString. 
     return new MyModels(connectionString); 
    } 
} 

और तुम CreateMyModels विधि कॉल कर सकते हैं भी आप MyModels वर्ग का दृष्टांत की जरूरत है:

using (MyModels models = MyModelsFactory.CreateMyModels()) 
{ 
    //your code 
} 

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