繁体   English   中英

实体框架无法更新数据库

[英]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 ,则需要删除并重新安装它们。 删除它们有些棘手:

  1. 可能从Windows Update 卸载所有SQL Server更新,我只是针对Service Pack 1,2,3这样做

  2. 转到注册HKLM\\SOFTWARE\\Classes\\Installer\\Assemblies\\Global 此位置

  3. 删除所有名称为 Microsoft.SqlServer.Types但在此之前进行注册表备份。请注意不要弄乱注册表。

  4. 以管理员身份运行Developer Command Prompt ,然后运行此命令 gacutil -i Microsoft.SqlServer.Types

  5. 修复您已经拥有的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM