【问题标题】:.NET 4.5 Beta DbGeography NotImplementedException.NET 4.5 Beta DbGeography NotImplementedException
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 谢谢!你是对的。我会用答案更新问题。
  • @Pawel 我在 Azure 上使用 DbGeography 类型并遇到了这个问题。如何在 Azure 上安装它?我可以将 Microsoft.SqlServer.Types.dll 包含到我的 Web 项目中吗?
  • 没关系。使用 nuget Install-Package Microsoft.SqlServer.Types 成功了
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    ENU\x64\SQLSysClrTypes.msi

    【讨论】:

      【解决方案4】:

      除了添加

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

      我还需要添加

      SqlServerSpatial110.dll

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多