[英]Entity Framework cannot update database
每当我保存到数据库时,我的应用程序就会崩溃并出现以下错误。
在 DLL“SqlServerSpatial110.dll”中找不到名为“SetClrFeatureSwitchMap”的入口点。
此错误于昨天下午在 Windows 更新和 PC 重新启动后开始。 dll 未在项目中引用,也不在 bin 文件夹中。
我使用 EF5,我可以连接到数据库并提取数据,但是当我调用 ObjectContext.SaveChanges() 时会发生错误。
该应用程序不使用几何,所以我不知道这是从哪里来的。
我遇到了同样的问题,并通过在应用程序的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类型。
因此,如果将以下代码行添加到应用程序的启动中,它将使用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的计算机很好。
我还在这里向Microsoft提交了一个错误:
https://connect.microsoft.com/SQLServer/Feedback/Details/2139143
从我这个错误的经验,这种情况只与实体框架5靶向.NET 4使用SQL Server时,与SQL Server Service Pack 3的可能的根本原因的详细信息(相对于.NET 4.5) 这里 。 适用于我的解决方案:
1)KdBoer的修复程序,或
2)将应用程序更新到Entity Framework 6
我知道我参加晚会很晚,但是我在MSSQL 2012上遇到了同样的问题,这确实很烦人。 我无法在带有Spatial列的表中运行任何查询 。 这有点棘手。 我总结一下我的方法,以防万一,
原因是由于SP3和CLR之间有些不一致 。 最好的方法是检查C:\\Windows\\assembly
,如果在此处看到某些Microsoft.SqlServer.Types
,则需要删除并重新安装它们。 删除它们有些棘手:
可能从Windows Update 卸载所有SQL Server更新,我只是针对Service Pack 1,2,3这样做
转到注册HKLM\\SOFTWARE\\Classes\\Installer\\Assemblies\\Global
此位置
删除所有名称为 Microsoft.SqlServer.Types
, 但在此之前进行注册表备份。请注意不要弄乱注册表。
以管理员身份运行Developer Command Prompt
,然后运行此命令 gacutil -i Microsoft.SqlServer.Types
修复您已经拥有的SQL Server的原始版本。
最终,即使使用Geometry(Spatial)数据,我也可以在任何表上执行任何查询 。
希望这对某些人有帮助。
上面的答案对我没有用,所以我做了一些进一步的挖掘,并在这里分享我的发现。
摘要 : Microsoft SQL Server 2012 SP2(11.0.2100.60)和SP3(11.0.6020.0)之间的Microsoft SQL Server系统CLR类型 ( SQLSysCLRTypes.msi
)库中进行了更改,可以通过升级此程序包和任何杂项来解决此问题。 DLL至最新版本(在撰写本文时对应于2012 SP4 / 11.0.7001.0)。
该软件包中实际上只有两件事:
Microsoft.SqlServer.Types.dll
包装器库 SqlServerSpatial110.dll
包含空间功能的本机库 请注意,有各种版本的SQLSysCLRTypes.msi
可用,与SQL Server的每个主要/次要版本相对应,但是令人讨厌的是,它们都以相同的文件名发布,除非您执行完整的SQL Server安装,否则它们往往是安装的手动先决条件SQL Server Feature Pack中的功能(例如,请参阅https://www.microsoft.com/zh-cn/download/details.aspx?id=56041 )
从软件包的SQL 2012 SP3版本开始, SqlServerSpatial110.dll
导出函数SetClrFeatureSwitchMap
,该函数从.NET包装DLL中的某个位置调用。 在SP3之前,该功能似乎不存在,.NET包装器也未尝试使用它。 (您可以使用dumpbin /exports <dll file>
列出DLL导出)
如果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的较新版本中也可能会发生类似的问题。
请注意,将对Microsoft.SqlServer.Types
引用的“特定版本”设置为“真”(在Visual Studio中)不会起作用,因为所有SQL Server 2012 CLR类型库版本都向.NET公开相同的版本号( 11.0.0.0),无论它们来自哪个Service Pack。
参考文献:
当我使用 Visual Studio 2022 而不是以前的 2019 时,它发生在我身上,尽管我认为它的出现是因为在 VS 2022 中,“使用 64 位版本的 IIS Express 用于 web 站点和项目”的选项(在选项/项目和解决方案/Web 中)项目)在默认情况下和 2019 年被选中
可能是由其他安装引起的,但对我来说,解决方案(或解决方法)是卸载 32 位和 64 位版本的“Microsoft SQL 服务器系统 CLR 类型 SQL 服务器 2012 类型”。 碰巧我安装了更多,所以直到现在我都没有遇到任何问题。 在尝试此操作之前,我在此处提供了所有选项(更改 web.config 等)无济于事。
@javacow 提供的解决方案是这个想法的来源,因为它说:
确保 SqlServerSpatial110.dll 的任何副本与 Microsoft.SqlServer.Types.dll 的任何副本具有相同的次要版本,并确保您拥有每个副本的最新版本。
我尝试在“Microsoft SQL Server System CLR Types for SQL Server 2012”的安装程序中匹配运行修复选项的次要版本和主要版本,但它没有运行,因为它缺少一些安装包,所以我决定卸载(为了以后安装它们,这似乎我不能,因为它抱怨安装了更新的版本)。 所以我尝试运行,即使没有这个版本,我的程序也能正常运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.