【发布时间】:2012-04-12 03:30:27
【问题描述】:
我有一个全新的服务器,我在上面安装了 .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 团队想要重用它。也不是很清楚这是否是基于提供程序的实现。更好的异常消息会节省一天的工作。
【问题讨论】:
-
依赖的原因其实是平台无关。 EF 向用户公开 DbGeography 和 DbGeometry 类型(与平台无关),但数据库有自己理解的空间类型。 Sql Server 有自己的空间类型,但 Oracle 将有自己的空间类型。空间提供者需要将 EF 空间类型转换为数据库可以理解的类型。由于您使用的是 SqlServer,SqlServer 特定空间提供程序将 DbGeometry 和 DbGeography 类型转换为 Sql Server 特定类型。 Sql Server 不理解 DbGeography 或 DbGeometry。
-
但是该代码没有使用 SQL Server;它只是一行 .NET 代码。我根本不与数据库交互。如果我想构建一个内存中的地理空间应用程序怎么办?为什么我不能只使用 .NET?
-
构建整个空间功能超出了实体框架的范围,它将复制 SqlServer 团队已经完成的工作。我们没有专业知识,我们宁愿把时间花在实体框架的新功能上。如果您需要在没有数据库的情况下使用空间类型,则最好使用仅关注空间功能的专用类型库。它可能也会表现得更好。
-
嗯...我添加了对 Microsoft.SqlServer.Types 和 EFCF5 的引用,但没有看到 DbGeography 类型。这仅适用于 .NET 4.5 还是 4.0?
-
对不起,我错过了你的评论。在 EF5 中,空间类型仅在 .NET Framework 4.5 中可用。在 EF6 中,空间类型在 .NET Framework 4 和 .NET Framework 4.5 上都可用。
标签: entity-framework spatial visual-studio-2012 .net-4.5