LocalDB 2012应用程序不使用Framework 4.0.3但适用于4.5

时间:2014-11-19 16:46:32

标签: c# .net winforms entity-framework localdb

最初我使用VS 2013开发了一个应用程序(winforms / c#):框架4.5,SQL Server 2012和EntityFramework 6,但由于用户客户端要求和场景发生了变化,应用程序被迁移到:framework 4.0.3, LocalDB 2012和EntityFramework 6。

要迁移项目框架,我只需更改目标版本,重新安装引用(包括EntityFramework)并检查app.config。

在VS中迁移mdfs,创建了一个数据连接,使用SQL Server DataProvider,ServerName(LocalDB)\ v11.0,WindowsAuthentication和附加数据库文件,这向我显示了它将影响数据库的警告,然后创建连接,此连接用于创建ADO实体数据模型。

要在客户端部署我使用的是WIX项目。

当我在安装了Framework 4.0.3的计算机上部署时,应用程序崩溃并显示错误:

"Underlying provider failed on open" and the innerexception was "A network-related or instance-specific occurred while establishing ..."

using (var dbContext = new SEDGRAICEntities())  <<-- Crashes Here
{                            
    try
    {
        var baseubigeo = (from u in dbContext.T_MAE_UBIGEOCCPP
                          select u.id_departamento.Trim() + u.id_provincia.Trim() + u.id_distrito.Trim() + u.id_centropoblado.Trim()).ToList();

        var query = from x in baselocalcp
                    where !baseubigeo.Contains(x)
                    select x;

        result = query.AsEnumerable<string>().ToList();
    }
    catch (DbEntityValidationException dbEEx)
    {
        dbContext.Database.Connection.Close();
        dbContext.Dispose();
        throw dbEEx;
    }
    catch (Exception Ex)
    {
        dbContext.Database.Connection.Close();
        dbContext.Dispose();
        throw Ex;
    }


}

SEDGRAICEntities:

public partial class SEDGRAICEntities : DbContext
{
    public SEDGRAICEntities()
        : base("name=SEDGRAICEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<DIS2K06> DIS2K06 { get; set; }
    public virtual DbSet<T_MAE_UBIGEOCCPP> T_MAE_UBIGEOCCPP { get; set; }
    public virtual DbSet<T_SEDD_GEOLOCALIZACIONCCPP> T_SEDD_GEOLOCALIZACIONCCPP { get; set; }

    public virtual ObjectResult<UbigeoValidacion> sp_ValidaUbigeoWGS84(string p_ver, string p_xmlData, Nullable<bool> p_boolGeo)
    {
        var p_verParameter = p_ver != null ?
            new ObjectParameter("p_ver", p_ver) :
            new ObjectParameter("p_ver", typeof(string));

        var p_xmlDataParameter = p_xmlData != null ?
            new ObjectParameter("p_xmlData", p_xmlData) :
            new ObjectParameter("p_xmlData", typeof(string));

        var p_boolGeoParameter = p_boolGeo.HasValue ?
            new ObjectParameter("p_boolGeo", p_boolGeo) :
            new ObjectParameter("p_boolGeo", typeof(bool));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<UbigeoValidacion>("sp_ValidaUbigeoWGS84", p_verParameter, p_xmlDataParameter, p_boolGeoParameter);
    }
}

App.Config上的SEDGRAICEntities连接字符串是:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <appSettings>
    <add key="BusinessID" value="20102010201" />
    <add key="BusinessName" value="TESTBUSINESS" />
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
  <connectionStrings>
    <add name="SEDGRAICCUADROSEntities" connectionString="metadata=res://*/erCUADROSmodel.csdl|res://*/erCUADROSmodel.ssdl|res://*/erCUADROSmodel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\SEDGRAIC.mdf;integrated security=true;connect timeout=60;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    <add name="SEDGRAICEntities" connectionString="metadata=res://*/erSEDGRAICmodel.csdl|res://*/erSEDGRAICmodel.ssdl|res://*/erSEDGRAICmodel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\SEDGRAIC.mdf;integrated security=true;connect timeout=60;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

当我在具有框架4.5的机器上部署完全相同的安装程序时,问题就在于该应用程序运行良好。

我使用VS 2010和框架4.0.3重新创建了解决方案,结果相同。

要求维护框架4.0.3,以保持与客户机的兼容性,所以我不能使用框架4.5。

我不明白为什么应用程序需要框架4.5才能工作,如果我删除所有(我认为)依赖项,甚至重新创建解决方案。

请帮助我。

奥马

1 个答案:

答案 0 :(得分:1)

感谢ErikEJ,我找到了一个解决方案:

framework 4的独立安装程序不包含支持LocalDB所需的更新(即使注册表中的版本[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .NET Framework Setup \ NDP \ v4 \ Full]说4.0)。 30319) 基本上,框架需要安装4.0.2版本的框架。一个人可能误导我们认为我们有更大的版本,但实际上,我们没有。

所以,感谢ErikEJ,发现我们有一种更有说服力的方法来找到实际的版本,如下所述:How can I find out if .NET 4.02 is installed?。 我只有2个注册表项,而不是我们需要的6个注册表项。

因此我们必须将更新安装到4.0.2(KB2544514)才能获得它们。安装完成后,现在我们有了安全使用LocalDB数据库所需的6个密钥。

奥马