【问题标题】:Entity Framework cannot update database实体框架无法更新数据库
【发布时间】:2019-09-27 15:02:44
【问题描述】:

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

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

此错误于昨天下午在 Windows 更新和 PC 重新启动后开始。该dll在项目中没有被引用,并且不在bin文件夹中。

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

应用程序不使用几何,所以我不知道这是从哪里来的。

【问题讨论】:

  • 到目前为止,我已经为 SQL 2008 R2 安装了 SP3,安装了 SQL 2014,删除了与 SqlServerSpatial110.dll 相关的任何内容。我在另一台 PC 上测试了代码并遇到了同样的问题。

标签: c# entity-framework


【解决方案1】:

我遇到了同样的问题,并通过将以下行添加到我的应用程序的 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 使用版本 10 的 SqlServer.Types.dll,它显然没有 Geometry 类型。

【讨论】:

  • 也为我工作!无需为我的应用程序使用较旧的 EF 版本卸载 SP3 的绝佳答案。谢谢!
  • 这个必须加在元素中,效果很好。
  • 这是部分答案 --- 如果您需要几何类型怎么办?
  • 如果这不起作用(它不适合我),您可能会尝试更改为版本 12,即:更改
  • 如果它有效,那就太好了。如果没有,请阅读@javacow 的答案。
【解决方案2】:

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

总结Microsoft SQL Server System CLR Types (SQLSysCLRTypes.msi) 库在 SQL Server 2012 SP2 (11.0.2100.60) 和 SP3 ( 11.0.6020.0),并且可以通过将此软件包和任何杂散 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 包装器也没有尝试使用它。 (您可以使用dumpbin /exports &lt;dll file&gt; 列出 DLL 导出)

如果 CLR Types MSI 包安装在特定机器上,并且这些 DLL 的不同 次要 版本位于您的 .NET 程序的工作目录中,那么您可能会收到错误消息。如果您分发程序及其依赖库以避免最终用户的额外安装步骤,则很容易发生这种情况。

每当 .NET 库安装到系统并包含在全局程序集缓存 (GAC) 中时,系统版本将始终由 .NET 程序加载,即使“本地”副本可以可以在工作目录中找到。对于本机库,首先使用工作目录副本。这意味着当您在应用程序中引用Microsoft.SqlServer.Types 并且在您的应用程序目录中具有匹配版本的两个DLL 时,如果Microsoft.SqlServer.Types 安装在具有相同主要版本(即11.0.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),无论它们来自哪个服务包。

参考资料:

【讨论】:

    【解决方案3】:

    所以,如果我将以下代码行添加到应用程序的启动中,它将使用 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

    【讨论】:

      【解决方案4】:

      我知道我迟到了,但 MSSQL 2012 遇到了同样的问题,这真的很烦人。我无法在具有空间列的表中运行任何查询。这有点棘手。我总结一下我的方法,以防万一,

      原因是因为SP3和CLR之间有一些inconsistency。最好的方法是检查C:\Windows\assembly,如果你在这里看到一些Microsoft.SqlServer.Types,你需要删除并重新安装它们。移除它们有点棘手:

      1. 可能是uninstall Windows Update 中的所有 SQL Server 更新,我只是为 Service Pack 1、2、3 执行此操作

      2. 在注册HKLM\SOFTWARE\Classes\Installer\Assemblies\Globalhere中转到这个位置

      3. Delete all keys with the nameMicrosoft.SqlServer.Types但在此之前备份注册表注意不要弄乱注册表。

      4. 以管理员身份运行Developer Command Promptrun this command gacutil -i Microsoft.SqlServer.Types

      5. 修复您已有的原始 SQL Server 版本。

      最后,即使使用几何(空间)数据,我也能够对任何表执行任何查询

      希望这对某些人有所帮助。

      【讨论】:

        【解决方案5】:

        根据我对这个错误的经验,当使用带有 SQL Server Service Pack 3 的 SQL Server 时,只有面向 .NET 4(而不是 .NET 4.5)的 Entity Framework 5 才会发生这种情况。有关可能的根本原因的更多信息here .对我有用的解决方案:
        1) KdBoer 的修复,或
        2) 将应用程序更新到 Entity Framework 6

        【讨论】:

        • 我们的应用程序在 .NET 4.5(虽然是 EF 5)上运行,但我们仍然遇到这个问题。由于 EF 本身很脆弱,我们不会冒险更新到新版本,所以 KdBoer 的答案就是要走的路。
        • 谢谢,veljkoz。我已删除该建议。
        猜你喜欢
        • 2022-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 2013-04-02
        • 2013-08-17
        相关资源
        最近更新 更多