实体框架无法更新数据库

Atr*_*ige 33 c# entity-framework

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

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

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

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

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

小智 69

我遇到了同样的问题,并通过在我的应用程序的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>
Run Code Online (Sandbox Code Playgroud)

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

  • 这必须添加到<configuration>元素中,并且它可以完美地工作. (3认同)
  • 这是一个部分答案---如果你需要几何类型怎么办? (3认同)

小智 6

上面的答案对我不起作用,所以我做了更多的挖掘并在这里分享我的发现。

摘要:SQL Server 2012 SP2 (11.0.2100.60) 和 SP3 (11.0.6020.0) 之间的Microsoft SQL Server System CLR Types ( SQLSysCLRTypes.msi) 库发生了变化,可以通过将此包和任何杂散 DLL 升级到最新版本(对应于撰写本文时的 2012 SP4 / 11.0.7001.0)。


这个包里只有两件事:

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

请注意,有无数版本SQLSysCLRTypes.msi可用,对应于 SQL Server 的每个主要/次要版本,但令人讨厌的是,它们都以相同的文件名发布,除非您执行完整的 SQL Server 安装,否则它们往往是从SQL Server 功能包(例如,请参阅https://www.microsoft.com/en-us/download/details.aspx?id=56041

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

如果 CLR Types MSI 包安装在特定机器上,并且这些 DLL的不同次要版本位于 .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 中可能会出现类似的问题。

请注意,将“特定版本”设置为“True”以引用Microsoft.SqlServer.Types(在 Visual Studio 中)没有效果,因为所有 SQL Server 2012 CLR 类型库版本都向 .NET (11.0.0.0) 公开相同的版本号,无论它们来自哪个服务包。

参考: