实体框架无法更新数据库

时间:2015-12-10 14:53:41

标签: c# entity-framework

每当我保存到数据库时,我的应用程序崩溃并出现以下错误。

  

无法在DLL“SqlServerSpatial110.dll”中找到名为“SetClrFeatureSwitchMap”的入口点。

在Windows Update和PC重新启动后,昨天下午开始出现此错误。 dll未在项目中引用,也不在bin文件夹中。

我使用EF5并且我可以连接到数据库并提取数据但是当我调用ObjectContext.SaveChanges()时会发生错误。

应用程序不使用几何体,所以我不知道它来自何处。

5 个答案:

答案 0 :(得分:68)

我遇到了同样的问题,并通过在我的应用程序的web.config中添加以下行来修复它:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" />
      <bindingRedirect oldVersion="1.0.0.0-11.0.0.0" newVersion="10.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

这会强制EntityFramework使用SqlServer.Types.dll的版本10,它显然没有Geometry类型。

答案 1 :(得分:4)

因此,如果我将以下代码行添加到应用程序的启动中,它将使用SQL 2014版本的Microsoft.SqlServer.Types程序集,它似乎没有上述问题。

System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

这适用于安装了SQL Server 2014 SDK的计算机。

我还在这里向微软提交了一个错误:

https://connect.microsoft.com/SQLServer/Feedback/Details/2139143

答案 2 :(得分:0)

根据我对此错误的体验,当使用带有SQL Server Service Pack 3的SQL Server时,仅在针对.NET 4的Entity Framework 5(而不是.NET 4.5)中发生这种情况。有关可能的根本原因的更多信息{{3 }}。对我有用的解决方案:
1)KdBoer的修复,或者 2)将应用程序更新到Entity Framework 6

答案 3 :(得分:0)

我知道我迟到了,但我遇到了同样的问题与MSSQL 2012 ,这真的很烦人。我无法在具有Spacial列的表中运行任何查询。这有点棘手。我总结了我的方法,以防其他人,

原因是SP3和CLR之间有一些inconsistency。最好的方法是检查C:\Windows\assembly,如果您在此处看到一些Microsoft.SqlServer.Types,则需要删除并重新安装它们。删除它们有点棘手:

  1. 可能uninstall来自Windows更新的所有SQL服务器更新,我刚刚为Service Pack 1,2,3做了这个

  2. 在注册机构HKLM\SOFTWARE\Classes\Installer\Assemblies\Global here

  3. 中转到此位置
  4. Delete all keys with the name Microsoft.SqlServer.Types但在此之前需要注册表备份请注意不要弄乱注册表。

  5. 以管理员身份运行Developer Command Promptrun this command gacutil -i Microsoft.SqlServer.Types

  6. 修复您已有的SQL Server的原始版本。

  7. 最后,即使使用几何(空间)数据,我也可以在任何表上执行任何查询。

    希望这可以帮助一些人。

答案 4 :(得分:0)

上面的答案对我不起作用,所以我做了一些更深入的研究,并在这里分享我的发现。

摘要:SQL Server 2012 SP2(11.0.2100.60)和 Microsoft SQL Server系统CLR类型SQLSysCLRTypes.msi)库之间发生了变化。 SP3(11.0.6020.0),可以通过将该程序包和任何杂散DLL升级到最新版本(在撰写本文时对应于2012 SP4 / 11.0.7001.0)来解决此问题。


此套件中实际上只有两件事:

  • Microsoft.SqlServer.Types.dll-.NET包装器库
  • SqlServerSpatial110.dll-包含空间功能的本机库

请注意,可以使用SQLSysCLRTypes.msi的各种版本,与SQL Server的每个主要/次要版本相对应,但是令人讨厌的是,它们都使用相同的文件名发布,除非您执行完整的SQL Server安装,否则它们往往会是从SQL Server Feature Pack安装内容的手动先决条件(例如,请参见https://www.microsoft.com/en-us/download/details.aspx?id=56041

从软件包的SQL 2012 SP3版本开始,SqlServerSpatial110.dll导出函数SetClrFeatureSwitchMap,该函数从.NET包装DLL中的某个位置调用。在SP3之前,该功能似乎不存在,.NET包装器也未尝试使用它。 (您可以使用dumpbin /exports <dll file>列出DLL导出)

如果CLR Types MSI软件包安装在特定计算机上,并且这些DLL的其他 minor 版本位于您的.NET程序的工作目录中,则可能会出现此错误。如果您将程序与程序的依赖库一起分发以避免最终用户执行额外的安装步骤,则很容易发生这种情况。

只要将.NET库安装到系统中并包含在全局程序集缓存(GAC)中,即使可以使用“本地”副本,.NET程序也会始终 加载系统版本。在工作目录中找到。对于本机库,首先使用工作目录副本。这意味着,当您在应用程序中引用Microsoft.SqlServer.Types并在应用程序目录中具有两个匹配版本的DLL时,如果Microsoft.SqlServer.Types安装在具有相同主要版本的系统上(例如11.0.0.0),那么当它尝试加载其本机库依赖项并从工作目录获取SqlServerSpatial110.dll的较旧版本而不是从可能安装在系统上的任何正确版本时,可能会出现问题。

如何修复:确保SqlServerSpatial110.dll的任何副本与Microsoft.SqlServer.Types.dll的任何副本具有相同的次要版本,并确保您每个都有最新版本。这可能仅适用于SQL Server 2012,但是在带有最终Service Pack版本的SQL Server的较新版本中也可能会发生类似的问题。

请注意,将所有对Microsoft.SqlServer.Types的引用的“特定版本”设置为“真”(在Visual Studio中)不会起作用,因为所有SQL Server 2012 CLR类型库版本都将相同的版本号公开给.NET(11.0.0.0),无论它们来自哪个Service Pack。

参考文献: