यह अपवाद आपको तब मिल सकता है जब Edmx एक प्रोजेक्ट में है और आप इसे दूसरे से उपयोग कर रहे हैं।
इसका कारण Res://*/
एक यूरी है जो CURRENT असेंबली में संसाधनों की ओर इशारा करता है। यदि Edm कोड का उपयोग करने वाले कोड से भिन्न असेंबली में परिभाषित किया गया है, तो res: // * / काम पर नहीं जा रहा है क्योंकि संसाधन नहीं मिल सकता है।
'*' को निर्दिष्ट करने के बजाय, आपको इसके बजाय (सार्वजनिक कुंजी टोकन सहित) विधानसभा का पूरा नाम प्रदान करने की आवश्यकता है। उदाहरण के लिए:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
कनेक्शन स्ट्रिंग्स के निर्माण का एक बेहतर तरीका EntityConnectionStringBuilder के साथ है:
public static string GetSqlCeConnectionString(string fileName)
{
var csBuilder = new EntityConnectionStringBuilder();
csBuilder.Provider = "System.Data.SqlServerCe.3.5";
csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);
csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
return csBuilder.ToString();
}
public static string GetSqlConnectionString(string serverName, string databaseName)
{
SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();
providerCs.DataSource = serverName;
providerCs.InitialCatalog = databaseName;
providerCs.IntegratedSecurity = true;
var csBuilder = new EntityConnectionStringBuilder();
csBuilder.Provider = "System.Data.SqlClient";
csBuilder.ProviderConnectionString = providerCs.ToString();
csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
return csBuilder.ToString();
}
यदि आप अभी भी अपवाद का सामना करते हैं, तो रिफ्लेक्टर में असेंबली खोलें और अपनी .csdl, .ssdl और .msl फ़ाइलों के लिए फ़ाइल नाम जांचें। जब मेटाडेटा मान में निर्दिष्ट संसाधनों के नाम अलग-अलग होते हैं, तो यह काम करने वाला नहीं है।