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

时间:2011-02-23 23:09:20

标签: c# entity-framework edmx

我希望能够通过配置更改将数据提供程序切换到SQL Server和SQL Server Compact Edition。但它不起作用,看着EDMX文件,我想我可以看到原因:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

我在这里写到:Comparison Entity Framework

答案 1 :(得分:1)

对于单元测试,我以这种方式更改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=&quot;Data Source=|DataDirectory|\Database1.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

有效)