在配置中更改实体框架提供程序

Posted

技术标签:

【中文标题】在配置中更改实体框架提供程序【英文标题】:Change Entity Framework provider in configuration 【发布时间】:2011-02-23 23:09:19 【问题描述】:

我希望能够通过仅更改配置来在 SQL Server 和 SQL Server Compact Edition 之间切换数据提供程序。但它不起作用,查看 EDMX 文件我想我可以明白为什么:

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

有没有办法在 app.config 或运行时指定提供者?

【问题讨论】:

【参考方案1】:

存储模型与特定的提供者绑定,这将导致实体框架拒绝任何与指定提供者不兼容的 DbConnection 实现。

如果您查看 Entity Framework 连接字符串,您可以看到 StorageSchema、ModelSchema 和 Mapping 在三个不同的文件中指定(它们是从您的 .edmx 生成的,而不是嵌入到程序集中)。您可以将 .edmx 拆开并自己嵌入 .ssdl、.csdl 和 .msl,然后为 SQL Server CE 创建另一个 .ssdl。这基本上只是复制和粘贴并替换提供程序和一些列类型。

我在这里写过:Comparison Entity Framework

【讨论】:

【参考方案2】:

对于单元测试,我以这种方式更改架构(在执行主代码之前更改 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>

有效)

【讨论】:

以上是关于在配置中更改实体框架提供程序的主要内容,如果未能解决你的问题,请参考以下文章

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序

实体框架6 - SQL Server和Oracle(SaveChanges)

无法让实体框架连接

如何在 Visual Studio 2013 中为 sqlite 配置实体框架 6

Azure KeyVault 配置提供程序在更改时重新加载值

具有不变名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在机器或应用程序配置文件中注册