最初我使用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="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\SEDGRAIC.mdf;integrated security=true;connect timeout=60;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\SEDGRAIC.mdf;integrated security=true;connect timeout=60;MultipleActiveResultSets=True;App=EntityFramework"" 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才能工作,如果我删除所有(我认为)依赖项,甚至重新创建解决方案。
请帮助我。
奥马
答案 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个密钥。
奥马