6

我有一个全新的服务器,我在上面安装了 .NET 4.5 Beta 可再发行组件。尝试使用空间功能时出现 NotImplemented 异常。这段代码...

var x = DbGeography.PointFromText(string.Format("POINT({0} {1})", -45, 45), 4326);

抛出这个异常...

System.NotImplementedException: The method or operation is not implemented.
at System.Data.Spatial.DefaultSpatialServices.GeographyPointFromText(String geographyText, Int32 spatialReferenceSystemId)

如果我安装完整的 VS.NET 11 Beta,那么代码就可以正常工作。任何想法为什么?什么不见​​了?

更新答案

感谢帕维尔。您需要安装 SQL CLR 类型。您可以在此链接获得 2012 版本:

Microsoft® SQL Server® 2012 的 Microsoft® System CLR 类型 http://www.microsoft.com/download/en/details.aspx?id=29065

观点

我真的不明白为什么 .NET 框架依赖于 SQL Server。这些课程没有什么特别之处。我意识到这可能是一个历史事件,代码最初是由 SQL 团队编写的,而 .NET 团队想要重用它。也不是很清楚这是否是基于提供程序的实现。更好的异常消息可以节省一天的工作。

4

4 回答 4

15

Entity Framework 中的 DefaultSpatialServices 使用 SqlGeography 和 SqlGeometry 类型作为支持类型。这两种类型存在于不属于 .NET Framework 的 Microsoft.SqlServer.Types.dll 程序集中。当 EF 找不到这些类型时抛出异常(异常可能更有帮助......)。当您安装 Visual Studio 时,它会在您的机器上安装 localdb(或者您可能已经有一个 SqlExpress 数据库),这可能是您在正在工作的机器上获取类型的方式。在只安装 .NET Framework 而没有安装 Sql Server 的机器上,您不会拥有这些类型。您可以在出现异常的盒子上安装 SqlExpress,也可以尝试仅安装类型。我不确定从哪里获得程序集本身,但我认为 Sql Server 功能包(http://www.microsoft.com/en-us/download/details.aspx?id=27596)可能有。支持来自 SqlServer 2008 和 SqlServer 2012 的类型,因此安装哪个版本无关紧要。

编辑

在 EF6 中,异常将包含更好的消息,请参阅:https ://entityframework.codeplex.com/SourceControl/changeset/b3eca2c141c0fb517504f9731dc8ba7a9c5727ee

用于跟踪此错误的工作项:https ://entityframework.codeplex.com/workitem/3

于 2012-04-12T21:13:10.073 回答
2

也许有人可以突出 darwindaves 的答案:

安装 nuget 包 Microsoft.SqlServer.Types。或者添加对以下内容的引用:

c:\Program Files(x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll 并确保在属性中标记为本地副本。

于 2013-07-09T21:36:27.783 回答
1

@Pawal 接受的答案帮助解决了我同样的问题。他指向“Microsoft SQL Server 2008 Service Pack 3 Feature Pack”的链接让我对我在目标机器上实际需要安装的内容有点不知所措,但最终确定我只需要以下内容:

ENU\x64\SQLSysClrTypes.msi

于 2018-12-04T11:10:25.873 回答
0

除了添加

c:\Program Files(x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll

我还需要添加

SqlServerSpatial110.dll

一旦我们添加了它们,它就像一个魅力!

于 2017-12-15T19:53:10.760 回答