.NET 4.5 Beta中的DbGeography未实现。

7
我有一台全新的服务器,在上面安装了.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,那么代码就能正常工作。有什么想法吗?缺少了什么?
答案更新
感谢Pawel。你需要安装SQL CLR类型。你可以在这个链接中获得2012版本:
Microsoft® System CLR Types for Microsoft® SQL Server® 2012 http://www.microsoft.com/download/en/details.aspx?id=29065 观点
我真的不明白为什么.NET框架依赖于SQL Server。这些类没有什么特别之处。我意识到这可能是一个历史问题,代码最初是由SQL团队编写的,而.NET团队想要重用它。这也不是一个基于提供程序的实现,更好的异常消息会节省一天的工作。

1
依赖关系的原因实际上是为了实现平台无关性。EF向用户公开了DbGeography和DbGeometry类型(这些类型是平台无关的),但是数据库有自己理解的空间类型。Sql Server有自己的空间类型,但Oracle也有自己的空间类型。空间提供程序需要将EF空间类型转换为数据库理解的类型。由于您正在使用SqlServer,因此SqlServer特定的空间提供程序将DbGeometry和DbGeography类型转换为SqlServer特定的类型。SqlServer不理解DbGeography或DbGeometry。 - Pawel
但那段代码并没有使用 SQL Server,它只是一行.NET代码而已。我根本没有与数据库交互。如果我想要构建一个内存地理空间应用程序怎么办?为什么不能只用 .NET 实现呢? - craig.tadlock
构建整个空间功能超出了Entity Framework的范围,这将是复制SqlServer团队已经完成的工作。我们没有专业知识,我们宁愿把这个时间花在Entity Framework的新功能上。如果您需要在没有数据库的情况下使用空间类型,您可能最好使用一个专门关注空间功能的类型库。它可能会表现得更好。 - Pawel
嗯...我添加了对Microsoft.SqlServer.Types和EFCF5的引用,但我没有看到DbGeography类型。这只适用于.NET 4.5还是也适用于4.0? - Rick Strahl
抱歉,我错过了你的评论。在EF5中,空间类型仅适用于.NET Framework 4.5。在EF6中,空间类型适用于.NET Framework 4和.NET Framework 4.5。 - Pawel
4个回答

16

实体框架中的DefaultSpatialServices使用SqlGeography和SqlGeometry类型作为后备类型。这两种类型位于Microsoft.SqlServer.Types.dll程序集中,该程序集不是.NET Framework的一部分。当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


谢谢!你是正确的。我会用答案更新问题。 - craig.tadlock
@Pawel 我在Azure上使用DbGeography类型时遇到了这个问题。我该如何在Azure上安装它?我能否将Microsoft.SqlServer.Types.dll包含到我的Web项目中? - tourdownunder
7
没关系。使用nuget安装“Microsoft.SqlServer.Types”包就行了。 - tourdownunder

2

也许有人可以强调darwindaves的答案:

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

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


1

@Pawal提供的被采纳的答案帮助我解决了同样的问题。他提供的“Microsoft SQL Server 2008 Service Pack 3 Feature Pack”链接让我有些困惑,不知道我实际上需要在目标机器上安装什么,但最终确定我只需要安装以下内容:

ENU\x64\SQLSysClrTypes.msi


0

除了添加

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

我还需要添加

SqlServerSpatial110.dll

当我们添加了这些内容后,它就像魔法般地工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接