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类型.
小智 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) 公开相同的版本号,无论它们来自哪个服务包。
参考: