Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架无法更新数据库_C#_Entity Framework - Fatal编程技术网

C# 实体框架无法更新数据库

C# 实体框架无法更新数据库,c#,entity-framework,C#,Entity Framework,每当我保存到数据库时,我的应用程序就会崩溃,并出现以下错误 在DLL“SqlServerSpatial110.DLL”中找不到名为“SetClrFeatureSwitchMap”的入口点 此错误是在昨天下午Windows更新和PC重新启动后开始的。dll未在项目中引用,也不在bin文件夹中 我使用EF5,可以连接到数据库并提取数据,但调用ObjectContext.SaveChanges()时会发生错误 应用程序不使用几何体,因此我不知道这是从哪里来的。因此,如果我在应用程序的启动中添加以下代码

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

在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
,您需要在此处删除并重新安装它们。移除它们有点棘手:

  • 可能是所有来自windows update的SQL server更新,我只是为Service Pack 1、2、3做了这些

  • 转到注册表中的此位置
    HKLM\SOFTWARE\Classes\Installer\Assemblies\Global

  • Microsoft.SqlServer.Types
    但在此之前,请进行注册表备份小心不要弄乱注册表

  • 以管理员身份运行
    Developer命令提示符
    ,并运行
    gacutil-i Microsoft.SqlServer.Types

  • 修复现有SQL server的原始版本

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


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

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

    摘要: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
      -.NET包装库
    • 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”不会产生任何效果