C# 实体框架无法更新数据库
每当我保存到数据库时,我的应用程序就会崩溃,并出现以下错误 在DLL“SqlServerSpatial110.DLL”中找不到名为“SetClrFeatureSwitchMap”的入口点 此错误是在昨天下午Windows更新和PC重新启动后开始的。dll未在项目中引用,也不在bin文件夹中 我使用EF5,可以连接到数据库并提取数据,但调用ObjectContext.SaveChanges()时会发生错误C# 实体框架无法更新数据库,c#,entity-framework,C#,Entity Framework,每当我保存到数据库时,我的应用程序就会崩溃,并出现以下错误 在DLL“SqlServerSpatial110.DLL”中找不到名为“SetClrFeatureSwitchMap”的入口点 此错误是在昨天下午Windows更新和PC重新启动后开始的。dll未在项目中引用,也不在bin文件夹中 我使用EF5,可以连接到数据库并提取数据,但调用ObjectContext.SaveChanges()时会发生错误 应用程序不使用几何体,因此我不知道这是从哪里来的。因此,如果我在应用程序的启动中添加以下代码
应用程序不使用几何体,因此我不知道这是从哪里来的。因此,如果我在应用程序的启动中添加以下代码行,它将使用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提交了一个错误:
我也遇到了同样的问题,并通过在我的应用程序的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,该版本显然没有几何体类型。根据我的经验,在使用SQL Server Service Pack 3的SQL Server时,仅当EntityFramework 5以.NET 4(而不是.NET 4.5)为目标时,才会发生这种情况。关于可能的根本原因的更多信息。对我有效的解决方案:
1) KdBoer的修复,或
2) 将应用程序更新到Entity Framework 6我知道我参加聚会迟到了,但我在MSSQL 2012上遇到了同样的问题,这真的很烦人。我无法在具有空间列的表中运行任何查询。这有点棘手。我总结了我的方法,以防万一 原因是SP3和CLR之间存在一些差异。最好的方法是检查
C:\Windows\assembly
,如果您看到一些Microsoft.SqlServer.Types
,您需要在此处删除并重新安装它们。移除它们有点棘手:
HKLM\SOFTWARE\Classes\Installer\Assemblies\Global
Microsoft.SqlServer.Types
,但在此之前,请进行注册表备份小心不要弄乱注册表Developer命令提示符
,并运行gacutil-i Microsoft.SqlServer.Types
希望这对一些人有所帮助。上面的答案对我来说并不适用,所以我做了更多的挖掘,并在这里分享我的发现 摘要: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相对应)
这个包中实际上只有两件事:
-.NET包装库Microsoft.SqlServer.Types.dll
-包含空间功能的本机库SqlServerSpatial110.dll
SQLSysCLRTypes.msi
的无数版本都是可用的,与SQL Server的每个主要/次要版本相对应,但令人烦恼的是,它们都是以相同的文件名发布的,除非您执行完整的SQL Server安装,否则它们往往是从SQL Server功能包安装东西的手动先决条件k(例如,请参见)
从SQL 2012 SP3版本的软件包开始,SqlServerSpatial110.dll
导出函数SetClrFeatureSwitchMap
,该函数是从.NET包装器dll中的某个位置调用的。在SP3之前,该函数似乎不存在,.NET包装器没有尝试使用它。(您可以使用dumpbin/exports
列出DLL导出)
如果CLR Types MSI软件包安装在特定计算机上,并且.NET程序的工作目录中存在这些DLL的其他次要版本,则可能会出现错误。如果您将程序与其依赖项库一起分发,以避免为最终用户执行额外的安装步骤,则很容易发生这种情况
每当.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,但在较新版本中可能会出现类似问题SQL Server的最终Service Pack版本
请注意,对于Microsoft.SqlServer.Types
(在Visual Studio中)的引用,将“Specific Version”设置为“True”不会产生任何效果