首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架无法更新数据库

实体框架无法更新数据库
EN

Stack Overflow用户
提问于 2015-12-10 14:53:40
回答 6查看 24.3K关注 0票数 39

每当我将应用程序保存到DB时,我的应用程序就会出现以下错误。

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

昨天下午,在Windows和PC重新启动之后,这个错误开始了。dll不在项目中引用,也不在bin文件夹中。

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-12-23 08:11:52

我也有同样的问题,并通过在我的应用程序的web.config中添加以下行来修正它:

代码语言:javascript
运行
复制
<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,它显然没有几何类型。

票数 84
EN

Stack Overflow用户

发布于 2019-09-27 07:02:44

上面的答案对我没有用,所以我做了更多的调查,并在这里分享我的发现。

汇总:Server 2012 SP2 (11.0.2100.60)和SP3 (11.0.6020.0)之间的Microsoft系统CLR类型 (SQLSysCLRTypes.msi)库发生了更改,可以通过将此包和任何丢失的DLL升级到最新版本(在编写本报告时对应于2012年SP4 / 11.0.7001.0 )来解决此问题。

这个包中实际上只有两件事:

  • Microsoft.SqlServer.Types.dll - .NET包装器库
  • SqlServerSpatial110.dll -包含空间功能的本机库

请注意,大量版本的SQLSysCLRTypes.msi是可用的,对应于Server的每个主要/次要版本,但令人烦恼的是,它们都是以相同的文件名发布的,除非您执行完整的Server安装,否则它们往往是从Server功能包安装东西的手动先决条件(例如,请参阅https://www.microsoft.com/en-us/download/details.aspx?id=56041)。

从该包的SQL 2012 SP3版本开始,SqlServerSpatial110.dll导出函数SetClrFeatureSwitchMap,该函数从.NET包装器DLL中的某个地方调用。在SP3之前,该函数似乎不存在,.NET包装器也没有尝试使用它。(可以使用dumpbin /exports <dll file>列出DLL导出)

如果CLR类型的MSI包安装在特定的计算机上,并且.NET程序的工作目录中有一个不同的次要版本的DLL,那么您可以得到错误。这很容易发生,如果您分发您的程序及其依赖库,以避免额外的安装步骤为最终用户。

每当.NET库安装到系统并包含在全局程序集缓存(GAC)中时,系统版本将始终由.NET程序加载,即使在工作目录中可以找到“本地”副本。对于本机库,首先使用工作目录副本。这意味着,当您在应用程序中引用Microsoft.SqlServer.Types并在应用程序目录中同时具有匹配版本的DLL时,如果Microsoft.SqlServer.Types安装在系统上的主版本相同(即。( 11.0.0.0),当它试图加载其本机库依赖项并从工作目录获得一个较旧版本的SqlServerSpatial110.dll时可能会出现问题,而不是从系统上可能安装的任何地方获得正确的版本。

How to Fix:确保SqlServerSpatial110.dll的任何副本都具有与任何Microsoft.SqlServer.Types.dll副本相同的次要版本,并确保每个副本都有最新版本。这可能只适用于Server 2012,但在最新版本的Server中可能会出现类似的问题,并最终发布Service。

请注意,为引用Microsoft.SqlServer.Types (在Visual中)将“特定版本”设置为"True“不会产生效果,因为所有Server 2012 CLR类型库版本都向.NET公开相同的版本号(11.0.0.0),而不管它们来自哪个服务包。

参考文献:

票数 7
EN

Stack Overflow用户

发布于 2015-12-18 15:09:54

因此,如果我将下面的代码添加到应用程序的启动中,它将使用Microsoft.SqlServer.Types程序集的SQL2014版本,该版本似乎没有上述问题。

代码语言:javascript
运行
复制
System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

对于安装了SQLServer2014SDK的计算机来说,这很好。

我还在这里向Microsoft提交了一个bug:

https://connect.microsoft.com/SQLServer/Feedback/Details/2139143

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34204990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档