2008-10-25 11 views
28

मैं एक वेब अनुप्रयोग है कि निम्नलिखित शामिल है:कनेक्शन स्ट्रिंग नरक/LINQ-एसक्यूएल/ASP.NET

  • एक वेब परियोजना (एक web.config एक कनेक्शन स्ट्रिंग युक्त फ़ाइल के साथ - लेकिन कोई वेब परियोजना में डेटा का उपयोग कोड)
  • एक डेटा का उपयोग परियोजना LINQ-एसक्यूएल कक्षाओं का उपयोग करता है वेब परियोजना यूआई के लिए संस्थाओं (इस परियोजना एक सेटिंग फ़ाइल और एक app.config है प्रदान करने के लिए - इन दोनों का संबंध तार है)

जब मैं बनाने और तैनात, वहाँ कोई सेटिंग फ़ाइल या app.con है डेटा एक्सेस .dll के साथ बिन निर्देशिका में अंजीर, लेकिन web.config फ़ाइल में कनेक्शन स्ट्रिंग को बदलना डेटाबेस के अनुसार नहीं बदलता है - इसलिए कनेक्शन स्ट्रिंग को डेटा एक्सेस डीएल में संकलित किया जाना चाहिए। एक कनेक्शन स्ट्रिंग जो इस्तेमाल किया जाता है है - वेबसाइट, डेटा का उपयोग DLLs, सब कुछ -

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

मैं इस गड़बड़ी को सबसे अच्छा कैसे हल करूं?

किसी भी मदद के लिए धन्यवाद।

+0

यह एसक्यूएल करने के लिए LINQ में एक बग हो रहा है, मैं संस्थाओं के लिए LINQ पर एक बहुत काम किया है और यह पहली बार मैं एसक्यूएल करने के लिए LINQ के साथ काम कर रहा हूँ और इस मुद्दे पहली बार सामना करना पड़ रहा है। –

उत्तर

14

मुझे डेटा एक्सेस लेयर (डीएएल) के साथ मेरी समस्या web.config फ़ाइल से कनेक्शन स्ट्रिंग का उपयोग करने में सक्षम होने में कोई समस्या नहीं है। आम तौर पर मैं सिर्फ डीएएल से कनेक्शन स्ट्रिंग सेक्शन कॉपी करता हूं और इसे web.config में पेस्ट करता हूं। मैं डेटा संदर्भ बनाने के लिए डीबीएमएल डिजाइनर का उपयोग कर रहा हूं।

यदि यह आपके लिए काम नहीं करेगा, तो आप डेटा संदर्भ कन्स्ट्रक्टर में कनेक्शन स्ट्रिंग निर्दिष्ट कर सकते हैं। आपके वेब प्रोजेक्ट में एक स्थिर वर्ग है जो आपकी कनेक्शन स्ट्रिंग्स सहित आपकी सेटिंग्स लोड करता है, और जब आप अपना डीएएल ऑब्जेक्ट बनाते हैं (या डेटा संदर्भ, इसे सीधे बनाते हैं) तो इसे कन्स्ट्रक्टर में पास कर दें।

public static class GlobalSettings 
{ 
    private static string dalConnectionString; 
    public static string DALConnectionString 
    { 
     get 
     { 
      if (dalConnectionString == null) 
      { 
       dalConnectionString = WebConfigurationManager 
             .ConnectionStrings["DALConnectionString"] 
             .ConnectionString; 
      } 
      return dalConnectionString; 
     } 
    } 
} 
... 

using (var context = new DALDataContext(GlobalSettings.DALConnectionString)) 
{ 
    ... 
} 
+0

+1, मेरे लिए काम करता है। –

+3

आह, मुझे अभी एहसास हुआ कि डीएएल = डेटा एक्सेस लेयर। हम न्यूटी-प्रकार सिंटैक्स के साथ थोड़ा धीमा हैं। –

+0

बेवकूफ होने के लिए खेद है, लेकिन मैं इस कक्षा को वेब ऐप प्रोजेक्ट में या डेटा एक्सेस प्रोजेक्ट में कहां रखूं। और क्या आपके पास वेब.कॉन्फिग में स्ट्रिंग के लिए डिफ़ॉल्ट रूप से DALDataContext() डिफ़ॉल्ट कन्स्ट्रक्टर को ओवरराइड करने के बारे में कोई विचार है। धन्यवाद – Kieran

0

कैसे एक ConnectionFactory वस्तु, कि एक पैरामीटर के रूप में एक enum लेता है और एक पूरी तरह से गठन कनेक्शन ऑब्जेक्ट को परिभाषित करने के बारे में?

6

स्टार्टअप प्रोजेक्ट के लिए कॉन्फ़िगरेशन फ़ाइल सभी शामिल परियोजनाओं के लिए कॉन्फ़िगरेशन सेटिंग्स को परिभाषित करेगी। उदाहरण के लिए यदि आपका वेब प्रोजेक्ट स्टार्टअप प्रोजेक्ट है, तो "ऐपसेटिंग" का कोई भी संदर्भ web.config से सेटिंग्स की तलाश करेगा, इसमें आपके डेटा एक्सेस प्रोजेक्ट से "ऐपसेटिंग" के किसी भी संदर्भ शामिल हैं। तो डेटा प्रोजेक्ट प्रोजेक्ट के app.config से किसी भी कॉन्फ़िगरेशन सेटिंग्स को वेब प्रोजेक्ट के web.config पर कॉपी करें।

1

इसे देखने का एक तरीका यहां है। किस घटक को किस डेटाबेस का उपयोग करना है, इस बारे में निर्णय लेना चाहिए? यह संभव है कि डेटाबेस (या कम से कम कनेक्शन स्ट्रिंग) भविष्य में बदल सकता है। क्या वेबसाइट तय करती है कि कौन से डेटाबेस का उपयोग करना है? या, डीएएल फैसला करता है?

आप देव, गुणवत्ता आश्वासन, UAT और उत्पादन डेटाबेस है, तो निम्न कनेक्शन तार प्रबंध महत्वपूर्ण है।

यदि वेबसाइट तय करती है, तो उसे कनेक्शन स्ट्रिंग को अपने web.config से DAL तक पास करना चाहिए। यदि वेबसाइट को पता नहीं है कि डेटा कहां से आता है या नहीं, तो कनेक्शन स्ट्रिंग डीएएल में है।

0

डेटा एक्सेस प्रोजेक्ट का उपयोग करने की आवश्यकता होने पर भी वेब एप्लिकेशन कनेक्शन स्ट्रिंग प्रदान कर सकता है। आप इसे कन्स्ट्रक्टर का हिस्सा बना सकते हैं।

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

3

आपका एप्लिकेशन केवल web.config फ़ाइल में कॉन्फ़िगर प्रविष्टियों का उपयोग करेगा। आप web.config फ़ाइल में dll कॉन्फ़िगरेशन सेटिंग डाल सकते हैं जब तक कि वे ठीक से संरचना कर रहे हों। मेरा उदाहरण माई नेमस्पेस का उपयोग करके वीबी विशिष्ट है, लेकिन यह आपको सामान्य विचार देता है।

कॉन्फ़िग फ़ाइल का configSections Paret में आप एक प्रवेश की आवश्यकता होगी:

<configSections> 
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="YourAssembly.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </sectionGroup></configSections> 

फिर कॉन्फ़िग फ़ाइल का applicationSettings भाग में आप प्रविष्टियों प्रत्येक dll के लिए डाल दिया:

<applicationSettings> 
     <YourAssembly.My.MySettings> 
     <setting name="DebugMode" serializeAs="String"> 
      <value>False</value> 
     </setting> 
     </YourAssembly.My.MySettings> 
    </applicationSettings> 
0

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

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

0

रोल अपनी खुद की ConnectionFactory .Config फ़ाइलों के आधार पर:

  • कुंजी/connectionstring जोड़े मैप करने के लिए एक कस्टम config अनुभाग को परिभाषित करें
  • कि config होस्ट नाम या machinename का उपयोग कर अनुभाग में सूंघ करने के लिए अपने ConnectionFactory सिखाओ उचित
  • अपने विभिन्न dev/qa/prod सर्वर के लिए कुंजी/कनेक्शनस्ट्रिंग मानों को पॉप्युलेट करें, और उन्हें अपने विभिन्न app.config, web.config आदि फ़ाइलों में छोड़ दें।

प्रो:

  • परियोजना के अंदर सभी जीवन है, तो कोई आश्चर्य
  • अतिरिक्त तैनाती लक्ष्य जोड़ना एक में एक कॉपी/पेस्ट ऑपरेशन है।कॉन्फ़िग फ़ाइल

कोन:

  • बड़ा बदसूरत एक्सएमएल वर्गों के लिए बनाता है, खासकर यदि आप एक दर्जन से अधिक उत्पादन सर्वर
  • आवश्यकताओं परियोजनाओं के बीच
  • आवश्यकताओं कोड परिवर्तन जोड़ने के लिए & पुनर्वितरित दोहराया जाना है नया लक्ष्य
  • कोड को पर्यावरण के बारे में जानने की आवश्यकता है जिसमें यह
5

रोल रजिस्ट्री के आधार पर अपने खुद के ConnectionFactory:

  • सॉफ्टवेयर के तहत अपने आवेदन के लिए एक रजिस्ट्री कुंजी जोड़ें/[YOUR_COMPANY]/[YOUR_APP]
  • एक स्ट्रिंग मान connectionstring
  • अपने ConnectionFactory सिखाओ के लिए जोड़ने उचित रजिस्ट्री कुंजी खोलने के लिए (एक स्थिर कन्स्ट्रक्टर में, प्रत्येक पृष्ठ लोड नहीं!)।
  • रजिस्ट्री जानकारी को .reg फ़ाइल के रूप में निर्यात करें, इसे स्रोत नियंत्रण में जोड़ें, संशोधित करें और अतिरिक्त मशीनों को सेट अप करने के लिए इसे लागू करें।

प्रो:

  • सरल वातावरण-विशिष्ट सेटिंग्स को हार्डकोड करने की कोई जरूरत स्थापित करने के लिए
  • connectionstring एक ही स्थान
  • वेब/app.config में नहीं
  • में रहती है, इसलिए।
  • वेब/app.config में
  • नहीं है, तो जूनियर देव जिमी गलती से देव डेटाबेस को देखने के लिए अपने उत्पादन सर्वर नहीं बता सकता

कोन: महत्वपूर्ण बातें कर रहे हैं

  • नहीं तुरंत स्पष्ट है कि रजिस्ट्री में रहना, इसलिए नए देवताओं को निर्देशों की आवश्यकता होगी।
  • नई तैनाती मशीन
  • रजिस्ट्री पुरानीस्कूल को कॉन्फ़िगर करते समय अतिरिक्त चरण। जूनियर देव आपको नकल करेंगे।
+0

@ जेसन: 2 उत्तरों सबमिट करने के लिए kudos। अच्छी तरह से पेशेवरों और विपक्ष बाहर सोचा। एक दुर्भाग्यपूर्ण कॉन 'वेब होस्टिंग नहीं' अनुकूल होगा। –

+0

पुराने स्कूल के लिए वोट - जूनियर देव जिमी – Kieran

4

प्रतिक्रियाओं के लिए धन्यवाद।

आप में से जो लोग कहते हैं कि एप्लिकेशन web.config में सेटिंग का उपयोग करेगा मामलों में जहां मैं इसे संदर्भ मेरे अपने कोड में के लिए सही हैं:

_connectionString = ConfigurationManager.AppSettings["ConnectionString"]; 

..लेकिन वहाँ LINQ के साथ एक अलग मुद्दा है -एसक्यूएल डेटाकॉन्टेक्स - मुझे लगता है कि वे पैरामीटर रहित कन्स्ट्रक्टर में उपयोग के लिए संकलित डीएल में कनेक्शन स्ट्रिंग शामिल हैं। जैसा कि tvanofosson कहते हैं, मुझे web.config में कनेक्शन स्ट्रिंग के संदर्भ में पास करके डेटाकॉन्टेक्स बनाने की आवश्यकता है। जहां मैं एक उलझन में था :)

+0

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

3

मुझे इस मुद्दे के साथ भी कुछ संघर्ष था। मुझे सी # आंशिक वर्ग परिभाषा का उपयोग करके और डीबीएमएल डिजाइनर द्वारा बनाए गए डेटाकॉन्टेक्स्ट का विस्तार करके एक समाधान मिला। यह समाधान काफी tvanfosson के जवाब के समान है।आपको क्या करना है डिफ़ॉल्ट सेटिंग्स के साथ आंशिक डेटाकॉन्टेक्स्ट क्लास बनाना सेटिंग्स से कनेक्शन कनेक्शन और डीबीएमएल डिज़ाइनर डीसी गुणों में कनेक्शन से कोई भी कनेक्शन सेट नहीं करना है। इस तरह कनेक्शन स्ट्रिंग को डीएलएल में संकलित नहीं किया जाएगा। डेटाकॉन्टेक्स्ट स्वचालित रूप से web.config कनेक्शनस्ट्रिंग सेटिंग्स से कनेक्शन स्ट्रिंग प्राप्त करेगा। मैंने परीक्षण नहीं किया है अगर यह app.config के साथ भी काम करता है, लेकिन मुझे लगता है कि इसे ठीक काम करना चाहिए।

namespace MyApplication { 
    /// <summary> 
    /// Summary description for MyDataContext 
    /// </summary> 
    /// 
    public partial class MyDataContext 
    { 
     public MyDataContext() : 
      base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString, mappingSource) 
     { 
      OnCreated(); 
     } 
    } 
} 
+0

उस कन्स्ट्रक्टर को एक संकलन समस्या नहीं जोड़ती है, क्योंकि डिज़ाइनर आंशिक वर्ग में पहले से ही एक ही कन्स्ट्रक्टर है? –

+0

आपके द्वारा चुने गए डिजाइनर गुणों (कनेक्शन अनुभाग) के आधार पर सही है, जेनरेट कोड एक पैरामीटर रहित कन्स्ट्रक्टर स्वयं बना सकता है। –

+0

यह मेरा पसंदीदा समाधान है। डिज़ाइनर में "कोई नहीं" कनेक्शन को सेट करना, जैसा कि हिहू ने बताया है, पैरामीटर रहित कन्स्ट्रक्टर को स्वतः उत्पन्न होने से रोक देगा, इसलिए कोई संकलन समस्या नहीं है। अधिक विस्तृत विवरण के साथ एक समान समाधान, [यहां] (http://stackoverflow.com/questions/5139043/point-connectionstring-in-dbml-to-app-config) वर्णित है। – Mac

2

में ऑटो कोड उत्पन्न कुछ भी से सुरक्षित रखने के लिए, डेटा संदर्भ की विधि OnCreated() में कनेक्शन की जानकारी ओवरराइड:

using System.Configuration; 
namespace MyApplication 
{ 
    partial void OnCreated() 
    { 
     // attempt to use named connection string from the calling config file 
     var conn = ConfigurationManager.ConnectionStrings["MyConnectionString"]; 
     if (conn != null) Connection.ConnectionString = conn.ConnectionString; 
    } 
} 

यहाँ आंशिक डीसी वर्ग का नमूना है

इस प्रकार डीबीएमएल डिजाइनर कनेक्शन सामग्री को अपने तरीके से कर सकता है (जो एक वेब प्रोजेक्ट के बाहर अच्छा नहीं है), लेकिन जब आप एप्लिकेशन चलाते हैं तो कनेक्शन के अंतिम नियंत्रण को पकड़ लेते हैं।

0

मैं जानता हूँ कि इस पुरानी है, लेकिन यहाँ मैं इसे कैसे करते हैं (मैं काफी @ सबा की तरह की तरह है, लेकिन मैं प्रयास नहीं किया है कि)

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

मैं इसे उस लड़के के लिए @tvanfosson - kudos से ऊपर के शीर्ष उत्तर पर आधारित करता हूं।

  1. अपने खुद के आधार वर्ग है, जो LinqDataContext
  2. से निकला

यहाँ VB कोड है बनाएँ:

Imports System.Configuration 

Public Class CustomDataContextBase 
    Inherits System.Data.Linq.DataContext 
    Implements IDisposable 

    Private Shared overrideConnectionString As String 

    Public Shared ReadOnly Property CustomConnectionString As String 
     Get 
      If String.IsNullOrEmpty(overrideConnectionString) Then 
       overrideConnectionString = ConfigurationManager.ConnectionStrings("MyAppConnectionString").ConnectionString 
      End If 

      Return overrideConnectionString 
     End Get 
    End Property 

    Public Sub New() 
     MyBase.New(CustomConnectionString) 
    End Sub 

    Public Sub New(ByVal connectionString As String) 
     MyBase.New(CustomConnectionString) 
    End Sub 

    Public Sub New(ByVal connectionString As String, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource) 
     MyBase.New(CustomConnectionString, mappingSource) 
    End Sub 

    Public Sub New(ByVal connection As IDbConnection, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource) 
     MyBase.New(CustomConnectionString, mappingSource) 
    End Sub 

End Class 
  1. अपने dbml फ़ाइल खोलें और गुण में, ऊपर वर्ग को जोड़ने बेस क्लास संपत्ति का नाम।

नोट, यदि आपने एक ही असेंबली में कस्टम डेटा संदर्भ वर्ग रखा है, तो बस कक्षा का नाम शामिल करें, उदा। CustomDataContext।

यदि वे अलग-अलग असेंबली में हैं, तो पूरी तरह से योग्य नाम का उपयोग करें, उदा। MyCo.MyApp.Data.CustomDataContext

  1. सुनिश्चित करने के लिए डिजाइनर सामान ठीक से काम करता है, वर्ग पुस्तकालय के लिए app.config फ़ाइल में अपने कनेक्शन स्ट्रिंग कॉपी। इसका उपयोग आईडीई के अलावा नहीं किया जाएगा।

यही है।

आप अपने कनेक्शन स्ट्रिंग नाम के लिए की आवश्यकता होगी एक ही

क्या आप अनिवार्य रूप से कर रहे हैं कनेक्शन की जानकारी dbml फ़ाइल में सेट अनदेखी करने के लिए डेटा संदर्भ मजबूर कर रहा है। कॉन्फ़िगरेशन मैनेजर विधियों का उपयोग करने का अर्थ यह होगा कि यह कॉलिंग असेंबली से कनेक्शन स्ट्रिंग उठाएगा।

HTH

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