2011-02-23 65 views
3

我希望能夠通過配置更改將數據提供程序切換到SQL Server和SQL Server Compact Edition或從SQL Server Compact Edition切換數據提供程序。但它不以EDMX文件,我想我可以看到,爲什麼工作和尋找:在配置中更改實體框架提供程序

<edmx:StorageModels> 
<Schema ... Provider="System.Data.SqlClient" ... 

有什麼方法來指定的app.config或在運行時供應商?

回答

2

Storage-Model綁定到特定的提供者,這將導致實體框架拒絕任何與指定提供者不兼容的DbConnection實現。

如果您查看實體框架連接字符串,可以看到StorageSchema,ModelSchema和Mapping在三個不同的文件(它們是從.edmx生成並嵌入程序集中)中指定的。您可以將.edmx分開,並自己嵌入.ssdl,.csdl和.msl,併爲SQL Server CE創建另一個.ssdl。這基本上只是複製&粘貼並替換提供者和一些列類型。

我寫在這裏:Comparison Entity Framework

1

單元測試我改變架構這種方式(主要改變代碼執行前SSDL)。

在代碼:

var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("Model1.ssdl"); 
    var ssdlFilePath = "<some-dir>\file1.ssdl"; 
    using (var file = File.Create(ssdlFilePath)) 
    { 
     StreamUtil.Copy(s, file); 
    } 
    var str = File.ReadAllText(ssdlFilePath); 
    str = str.Replace("old provider token", "ProviderManifestToken=\"4.0\""); 
    str = str.Replace("old provider type"", "Provider=\"System.Data.SqlServerCe.4.0\""); 
    File.WriteAllText(ssdlFilePath, str); 

在app.config中:

<connectionStrings> 
    <add name="Database2Entities" connectionString="metadata=res://*/Model1.csdl|<some-dir>\file1.ssdl|res://*/Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\Database1.sdf&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

它的工作原理)