实体框架使用不同提供者的模型

时间:2010-10-17 21:27:40

标签: .net entity-framework entity-framework-4

我有一个实体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?

2 个答案:

答案 0 :(得分:4)

除了交换连接字符串以支持不同的提供者之外,您还需要做更多的工作。本文介绍了如何支持多个提供程序:

  

Preparing an Entity Framework model for multi provider support

本文涵盖了对VistaDB和SQL Server的支持,但适用相同的原则。

答案 1 :(得分:3)

是的,我刚遇到同样的问题 - 我们的应用程序使用SQL Server,但使用SQL Server CE执行单元测试。我已经阅读了Kev提供的文章,并提出了一项自动化改进措施,以防止手动复制文件。

假设“元数据工件处理”设置为“嵌入输出程序集”,您可以执行以下操作:

library(dplyr)
library(ggplot2)

is_outlier <- function(x) {
  return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))
}

mtcars %>%
  group_by(cyl) %>%
  mutate(outlier = ifelse(is_outlier(drat), drat, as.numeric(NA))) %>%
  ggplot(., aes(x = factor(cyl), y = drat)) +
    geom_boxplot() +
    geom_text(aes(label = outlier), na.rm = TRUE, hjust = -0.3)

然后将连接字符串设置为:

    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();
    }

希望有一天能帮到某人;)