代码之家  ›  专栏  ›  技术社区  ›  Kenoyer130

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

  •  3
  • Kenoyer130  · 技术社区  · 16 年前

    我有一个实体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 回复  |  直到 9 年前
        1
  •  4
  •   erlando    16 年前

    您需要做更多的工作,而不仅仅是交换连接字符串以支持不同的提供程序。本文解释如何支持多个提供者:

    Preparing an Entity Framework model for multi provider support

    本文介绍了支持vistadb和SQL Server,但同样的原则也适用。

        2
  •  3
  •   marc_s MisterSmith    9 年前

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

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

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

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

    <add name="DomainDbContext" 
         connectionString="metadata=res://*/Entities.Entities.csdl|./Entities.Entities.ssdl|res://*/Entities.Entities.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=StraDaLB_DM.sdf&quot;" 
         providerName="System.Data.EntityClient" />
    

    希望有一天这能帮助别人;)