2011-04-25 4 views
24

मैं Silverlight में, विभिन्न इकाइयों एक ही डाटाबेस जानकारी साझा करना चाहते .. लेकिन मैं कनेक्शन स्ट्रिंग xyz नामित किया जाना चाहते हैं और हर किसी को उपयोग किया है कि machine.config से कनेक्शन स्ट्रिंग ...कनेक्शन स्ट्रिंग्स

संस्थाओं का मेटा डेटा हिस्सा अलग होगा क्योंकि मैंने इकाइयों का नाम नहीं दिया था ..

क्या मैं उस मेटाडेटा अनुभाग में एकाधिक इकाइयां डाल सकता हूं?

यहाँ एक उदाहरण है .. मैं इस कनेक्शन स्ट्रिंग का उपयोग करना चाहते हैं, लेकिन ध्यान दें कि मैं मेटाडाटा अनुभाग में, विभिन्न इकाइयों डाल ..

मूल रूप से मैं इस कनेक्शन स्ट्रिंग ले जाना चाहते

<add name="XYZ" connectionString="metadata=res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

और इस कनेक्शन स्ट्रिंग

<add name="XYZ" connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SOMESERVER;Initial Catalog=SOMECATALOG;Persist Security Info=True;User ID=Entity;Password=Entity;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

इस कनेक्शन स्ट्रिंग बनाने के

<add name="XYZ" connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl|res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SOMESERVER;Initial Catalog=SOMECATALOG;Persist Security Info=True;User ID=Entity;Password=SOMEPASSWORD;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

लेकिन यह बस काम नहीं करता है। न तो परियोजना उससे जुड़ सकती है।

string encConnection = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString; 
Type contextType = typeof(test_Entities); 
object objContext = Activator.CreateInstance(contextType, encConnection); 
return objContext as test_Entities; 
+0

कृपया एक कोड नमूना प्रदान करें; आप कैसे जुड़ रहे हैं क्या यह डोमेन भर में है? –

+0

वही मशीन एक ही डोमेन .. यदि मेरे पास 2 कनेक्शन स्ट्रिंग अलग हैं तो यह ठीक काम करता है .. लेकिन मैं अधिक परियोजनाओं को बढ़ा रहा हूं और तैनाती की आसानी के लिए मैं चाहता हूं कि वे सभी एक ही कनेक्शन स्ट्रिंग से डेटासोर्स के रूप में खींच सकें उनके लिए सभी – Rico

उत्तर

37

दुर्भाग्य से, एक ही नामित कनेक्शन में एकाधिक इकाई संदर्भों को संयोजित करना संभव नहीं है। यदि आप अपने एंटिटी फ्रेमवर्क कनेक्शन को परिभाषित करने के लिए .config फ़ाइल से नामित कनेक्शन स्ट्रिंग का उपयोग करना चाहते हैं, तो प्रत्येक के पास अलग-अलग नाम होना चाहिए।

<add name="ModEntity" connectionString="metadata=res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
<add name="Entity" connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SOMESERVER;Initial Catalog=SOMECATALOG;Persist Security Info=True;User ID=Entity;Password=Entity;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

हालांकि, अगर आप नाम स्थान संघर्षों के साथ खत्म हो, तो आप कोई भी नाम का उपयोग कर सकते है और जब यह उत्पन्न होता है बस संदर्भ के लिए सही नाम पारित: परंपरा के मुताबिक, उस नाम आम तौर पर संदर्भ का नाम है :

var context = new Entity("EntityV2"); 

जाहिर है, इस रणनीति सबसे अच्छा काम करता है, तो आप या तो एक कारखाने या निर्भरता इंजेक्शन का उपयोग कर रहे अपने संदर्भों का उत्पादन करने के लिए।

एक और विकल्प प्रत्येक संदर्भ की संपूर्ण कनेक्शन स्ट्रिंग को प्रोग्रामेटिक रूप से प्रस्तुत करना होगा, और उसके बाद पूरी स्ट्रिंग को कन्स्ट्रक्टर (केवल नाम नहीं) में पास करना होगा।

// Get "Data Source=SomeServer..." 
var innerConnectionString = GetInnerConnectionStringFromMachinConfig(); 
// Build the Entity Framework connection string. 
var connectionString = CreateEntityConnectionString("Entity", innerConnectionString); 
var context = new EntityContext(connectionString); 

कैसे कुछ इस तरह के बारे में:

Type contextType = typeof(test_Entities); 
string innerConnectionString = ConfigurationManager.ConnectionStrings["Inner"].ConnectionString; 
string entConnection = 
    string.Format(
     "metadata=res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl;provider=System.Data.SqlClient;provider connection string=\"{1}\"", 
     contextType.Name, 
     innerConnectionString); 
object objContext = Activator.CreateInstance(contextType, entConnection); 
return objContext as test_Entities; 

... अपने machine.config में निम्नलिखित के साथ:

<add name="Inner" connectionString="Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 

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

+0

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

+0

@ रिको: दाएं। तो बस मशीन स्ट्रिंग के कनेक्शन के स्ट्रिंग का "आंतरिक" भाग डालें। कॉनफिग, और फिर उस आंतरिक कनेक्शन स्ट्रिंग के आधार पर प्रत्येक संदर्भ की कनेक्शन स्ट्रिंग उत्पन्न करें। – StriplingWarrior

0

सिल्वरलाइट अनुप्रयोगों को machine.config तक सीधे पहुंच नहीं है।

+0

वेब पक्ष है जहां मेरी संस्थाएं रखती हैं ... – Rico

2

सबसे पहले यह समझने की कोशिश करें कि इकाई फ्रेमवर्क कनेक्शन स्ट्रिंग कैसे काम करती है तो आपको पता चलेगा कि क्या गलत है।

  1. आप दो विभिन्न मॉडलों, इकाई और ModEntity
  2. इसका मतलब है आप दो अलग अलग संदर्भों है, प्रत्येक अपने स्वयं के संदर्भ भंडारण मॉडल, वैचारिक मॉडल और दोनों के बीच मानचित्रण है।
  3. आपने स्ट्रिंग को जोड़ दिया है, लेकिन एंटीटी के संदर्भ को कैसे पता चलेगा कि इसे entity.csdl पिकअप करना है और ModEntity pickentity.csdl पिकअप करेगा? वैसे कोई कुछ बुद्धिमान कोड लिख सकता है लेकिन मुझे नहीं लगता कि यह ईएफ विकास टीम की प्राथमिक भूमिका है।
  4. इसके अलावा machine.config खराब विचार है।
  5. यदि वेब ऐप्स अलग-अलग मशीन पर स्थानांतरित हो जाते हैं, या साझा होस्टिंग वातावरण या रखरखाव के उद्देश्य से यह समस्याएं पैदा कर सकता है।
  6. हर कोई इसे एक्सेस करने में सक्षम होगा, आप इसे असुरक्षित बना रहे हैं। यदि कोई सर्वर पर कोई वेब ऐप या किसी .NET ऐप को तैनात कर सकता है, तो उन्हें आपकी संवेदनशील पासवर्ड जानकारी सहित आपकी कनेक्शन स्ट्रिंग तक पूर्ण पहुंच मिलती है।

एक अन्य विकल्प यह है कि आप अपने संदर्भ के लिए अपने स्वयं के निर्माता बना सकते हैं और अपने स्वयं के कनेक्शन स्ट्रिंग गुजरती हैं और आप कुछ लिख सकते हैं अगर हालत आदि web.config से चूक लोड करने के लिए ऐसा करने के लिए

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

1

मुझे क्या समझता है कि आप इसमें अलग मेटाडेटा के साथ एक ही कनेक्शन स्ट्रिंग चाहते हैं। तो आप नीचे दिए गए कनेक्शनस्ट्रिंग का उपयोग कर सकते हैं और भाग को प्रतिस्थापित कर सकते हैं। मैंने आपके अनुक्रमित कनेक्शन का उपयोग उसी अनुक्रम में किया है।

connectionString="<METADATA>provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True&quot;" 

पहले connectionstring लिए "metadata=res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;"

साथ <METADATA> की जगह दूसरा connectionstring लिए "metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl;"

साथ <METADATA> की जगह तीसरे connectionstring लिए "metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl|res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;"

मुबारक कोडिंग के साथ <METADATA> की जगह!

+0

हम्म यह काम नहीं किया – Rico

+0

क्या यह कुछ त्रुटि दिखाता है? – Ravia

5

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

CREATE TABLE [dbo].[SystemConfig] 
    ( 
     [Id] [int] IDENTITY(1, 1) 
       NOT NULL , 
     [AppName] [varchar](128) NULL , 
     [ScopeName] [varchar](128) NOT NULL , 
     [Key] [varchar](256) NOT NULL , 
     [Value] [varchar](MAX) NOT NULL , 
     CONSTRAINT [PK_SystemConfig_ID] PRIMARY KEY NONCLUSTERED ([Id] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) 
ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[SystemConfig] ADD CONSTRAINT [DF_SystemConfig_ScopeName] DEFAULT ('SystemConfig') FOR [ScopeName] 
GO 
इस तरह के विन्यास तालिका के साथ

आप इस तरह की तरह पंक्तियों बना सकते हैं:

अपने अपने आवेदन दल (एस) एफई लपेटकर आप आसानी से scoped विन्यास प्राप्त कर सकते हैं से

तो।
यदि आप दाल (ओं) का उपयोग नहीं कर रहे हैं और सीधे ईएफ के साथ तार में काम कर रहे हैं, तो आप सिस्टम कॉन्फिग तालिका से एक इकाई बना सकते हैं और उस एप्लिकेशन के आधार पर मूल्य का उपयोग कर सकते हैं।

1) एक ConnectionManager परिभाषित करें::

+0

+1 दिलचस्प समाधान, मुझे यह कोशिश करनी पड़ सकती है। – Maslow

+0

यह मूल रूप से कॉन्फ़िगरेशन फ़ाइल के लिए एक प्रतिस्थापन है। केवल एक चीज जो आपको अपनी कॉन्फ़िगरेशन में निर्दिष्ट करने की आवश्यकता होगी वह ऐप का नाम और SystemConfigConnectionString है ... बाकी सब कुछ डीबी में जाता है। बहुत ही सुविधाजनक :) –

2

विभिन्न डेटाबेस और डेटाबेस प्रदाताओं तक पहुंचने और विपरीत शिकंजा मैं निम्नलिखित तकनीक का उपयोग करने के लिए एक ही edmx सक्षम करने के लिए

2) टी -4 कि बनाता है संशोधित अपने ObjectContext इतना है कि यह ConnectionManager का उपयोग करेगा:

public partial class MyModelUnitOfWork : ObjectContext 
{ 
    public const string ContainerName = "MyModelUnitOfWork"; 
    public static readonly string ConnectionString 
     = ConnectionManager.GetConnectionString("MyModel"); 

3) app.config में निम्नलिखित पंक्तियां जोड़ें:

+०१२३५१६४१०
 
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <connectionStrings> 
    <add name="MyModelUnitOfWork" connectionString=... /> 
    </connectionStrings> 
    <appSettings> 
    <add key="MyModelUnitOfWorkConnectionString" value="data source=MyPc\SqlExpress;initial catalog=MyDB;integrated security=True;multipleactiveresultsets=True" /> 
    <add key="MyModelUnitOfWorkProvider" value="System.Data.SqlClient" /> 
    </appSettings> 
</configuration> 

कनेक्शन प्रबंधक कनेक्शन कनेक्शन और प्रदाता को App.Config में जो भी है, उसे प्रतिस्थापित करेगा।

आप सभी ऑब्जेक्ट कॉन्टैक्स के लिए एक ही कनेक्शन प्रबंधक का उपयोग कर सकते हैं (इसलिए वे सभी ऐप.कॉन्फिग से एक ही सेटिंग्स को पढ़ते हैं), या टी 4 को संपादित करते हैं, इसलिए यह प्रत्येक के लिए एक कनेक्शन प्रबंधक बनाता है (अपने नामस्थान में), ताकि प्रत्येक अलग हो सेटिंग्स।