2010-10-17 51 views
3

我有一個實體4.0模型使用SqlServerCE數據庫作爲其提供者。在服務器上,我想使用相同的項目,只是將連接字符串切換爲使用實際的SqlServer數據庫。實體框架使用模型爲不同的提供者

這裏是我的連接字符串

<add name="Entities" 
     connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl; 
provider=System.Data.SqlClient; 
provider connection string=&quot; 
Data Source=xxxx; 
Initial Catalog=xxxx;User ID=xxxx;Password=xxxx;&quot;" 
providerName="System.Data.EntityClient" /> 

當我嘗試查詢實體模型,我得到以下錯誤:

SqlCeCommand.CommandTimeout does not support non-zero values. 

如果我設置了上下文的超時時間爲0,然後說

Unable to cast object of type 'System.Data.SqlClient.SqlConnection' 
to type 'System.Data.SqlServerCe.SqlCeConnection'. 

如何將提供程序從SqlServerCE設置爲SqlClient?

回答

4

您只需要交換連接字符串以支持不同的提供者就可以做更多的工作。本文介紹瞭如何支持多個供應商:

Preparing an Entity Framework model for multi provider support

本文涵蓋支持VistaDB的和SQL Server,但同樣的原則也適用。

+1

採取了一些做,但我得到它的工作。仍然無法將其作爲資源加載。如果你從sqlserverCE到sqlserver,你必須添加Schema屬性。 – Kenoyer130 2010-10-17 23:49:35

3

是的,我剛剛遇到同樣的問題 - 我們的應用程序使用SQL Server,但單元測試使用SQL Server CE執行。我已閱讀由Kev提供的文章,並提出了一項自動化改進措施,以防止手動複製文件。

假設「元數據神器處理」設置爲「嵌入在輸出組件」你可以到以下幾點:

public void SetupOnce() 
    { 
     var assembly = typeof(TContext).Assembly; 
     var ssdlRes = assembly.GetManifestResourceNames().Single(e => e.EndsWith("ssdl")); //TODO handle multiple contexts 

     using (var stream = assembly.GetManifestResourceStream(ssdlRes)) 
     using (var reader = new StreamReader(stream)) 
     { 
      var result = reader.ReadToEnd().Replace("Provider=\"System.Data.SqlClient\"", "Provider=\"System.Data.SqlServerCe.4.0\""); 
      File.WriteAllText(ssdlRes, result); 
     } 

     Context = new TContext(); 
    } 

然後連接字符串設定爲:

<add name="DomainDbContext" 
    connectionString="metadata=res://*/Entities.Entities.csdl|./Entities.Entities.ssdl|res://*/Entities.Entities.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=StraDaLB_DM.sdf&quot;" 
    providerName="System.Data.EntityClient" /> 

希望這有助於某人某天;)