我希望能够通过配置更改来将数据提供程序切换到 SQL Server 和 SQL Server Compact Edition。但它不起作用,查看 EDMX 文件我想我可以明白为什么:
<edmx:StorageModels>
<Schema ... Provider="System.Data.SqlClient" ...
有没有办法在 app.config 或运行时指定提供程序?
我希望能够通过配置更改来将数据提供程序切换到 SQL Server 和 SQL Server Compact Edition。但它不起作用,查看 EDMX 文件我想我可以明白为什么:
<edmx:StorageModels>
<Schema ... Provider="System.Data.SqlClient" ...
有没有办法在 app.config 或运行时指定提供程序?
Storage-Model 绑定到特定的提供者,这将导致实体框架拒绝任何与指定提供者不兼容的 DbConnection 实现。
如果您查看实体框架连接字符串,您可以看到 StorageSchema、ModelSchema 和 Mapping 在三个不同的文件中指定(它们是从您的 .edmx 生成的,而不是嵌入到程序集中)。您可以将 .edmx 拆开并自己嵌入 .ssdl、.csdl 和 .msl,然后为 SQL Server CE 创建另一个 .ssdl。这基本上只是复制和粘贴并替换提供程序和一些列类型。
我在这里写过:比较实体框架
对于单元测试,我以这种方式更改 Schema(在主代码执行之前更改 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="Data Source=|DataDirectory|\Database1.sdf"" providerName="System.Data.EntityClient" />
</connectionStrings>
有用)