【问题标题】:System.Data.Entity.Spatial replacement in ASP.NET CoreASP.NET Core 中的 System.Data.Entity.Spatial 替换
【发布时间】:2016-08-02 18:45:36
【问题描述】:

我正在尝试将 Web 表单从 ASP.NET MVC 迁移到 ASP.NET Core MVC。目前我正在寻找一种替代方法:

using System.Data.Entity.Spatial;

因为它目前在 .NET Core 中不可用,或者我可能无法找到它。

有没有办法包含这个包?也许通过 NuGet 包?

附言。我简要阅读了 Microsoft 指南,但找不到与之相关的任何内容。对于可能处于类似情况的任何人,指南在这里: https://docs.asp.net/en/latest/migration/mvc.html

(对不起,如果我不能写一个好问题,我正在努力适应这里的系统)

【问题讨论】:

标签: c# asp.net-core


【解决方案1】:

编辑

此功能是 EF Core 2.2 中的新功能

空间数据现已添加到 EF Core 2.2 (see documentation)


在 EF Core 2.2 版本之前使用这个:

现在您可以将Microsoft.Spatial 用于geographygeometry 空间操作。

ofc , EntityframeworkCore 不支持空间,因此您不能在 codefirst 中创建具有地理数据类型的字段,我建议您使用纯 SQL 推荐来执行此操作,直到 EntityframeworkCore 在 2017 年第二季度支持空间 (See this )。如果你不知道我会怎么告诉你。

  1. 首先你需要添加一个地理数据类型的字段, 所以你需要在一个迁移类中运行这个推荐:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql("ALTER TABLE [dbo].[Cities] ADD [Location] geography");
    }
    
  2. 如果您使用 UnitOfWork,您可以在插入这样的记录后更新 Location 字段:

        try
        {
            City city = new City
            {
                Title = creator.Title
            };
    
            _cities.Add(city);
    
            _uow.ExecuteSqlCommand("UPDATE Cities SET Location = geography::STPointFromText('POINT(' + CAST({0} AS VARCHAR(20)) + ' ' + CAST({1} AS VARCHAR(20)) + ')', 4326) WHERE(ID = {2})", city.Longitude, city.Latitude, city.ID);
    
            return RedirectToAction("Index");
        }
        catch
        {
            return View(creator);
        }
    
  3. 现在如果你想找到附近的城市,你可以使用这个推荐:

        var cities = _uow.Set<City>()
            .FromSql(@"DECLARE @g geography = geography::STPointFromText('POINT(' + CAST({0} AS VARCHAR(20)) + ' ' + CAST({1} AS VARCHAR(20)) + ')', 4326);
                       Select ID, Address, CreationDate, CreationDateInPersian, CreationDateStandard, CreatorRealName, CreatorUserID, ExLanguageID, IsActive, IsDeleted, Latitude, Longitude, ModifierRealName, ModifierUserID, ModifyDate, ModifyDateInPersian, ModifyDateStandard, PhoneNumbers, Summary, TimeStamp, Title, Image from Cities
                       ORDER BY Location.STDistance(@g) DESC;",
                       35.738083, 51.591263)
                       .Select(x => new AllRecordsViewModel
                       {
                           ID = x.ID,
                           Title = x.Title
                       })
            .ToList();
    
        return View(cities);
    

// 最近城市的结果:

1.德黑兰
2.安卡拉
3.巴黎
4.华盛顿特区

记住!您应该选择除具有地理数据类型的字段之外的所有记录!

【讨论】:

  • 您可能想要使用同样来自 Microsoft 的 System.Spatial 包,而不是 Microsoft.Spatial。
  • 嗨@AuriRahimzadeh 你能提供一个文档链接吗?我找到了,但是文档很笼统。谢谢
【解决方案2】:

Entity Framework Core 尚不支持空间数据。

Spatial 没有计划用于 2.0,我们还没有完成之后版本的计划。在https://github.com/aspnet/EntityFramework/issues/1100 上发布有关您希望在空间支持方面获得什么的更多详细信息可能是一个好主意,例如您是使用特定的空间功能,还是需要具有各种空间功能的丰富空间类型,您会仅将其用于特定数据库还是需要针对多个数据库编写相同的代码?等等。

(Source: MSDN .NET Blog)

我已经做了一个临时解决方法来包含 Geography 列并在 EF Core 1.0.0 及更高版本中使用它。它并不完美,但现在可以。 (显然,类似于Hatef’s answer,哇,我猜伟大的思想都一样。)

查看接受的答案:Entity Framework Core: Type Udt is not supported on this platform. (Spatial Data - Geography)

【讨论】:

  • 在第 1100 期找到这个 comment 引导我到 docs,它告诉你要下载哪个 NetTopologySuite NuGet 包以及如何使用它
  • @ono2012 很高兴知道终于有更新了。酷:)
【解决方案3】:

这纯粹是因为 Entity Framework 7 不支持 Spatial 的东西。 。 您可以在此处关注与它相关的 github 问题。 https://github.com/aspnet/EntityFramework/issues/1100

【讨论】:

  • 我昨天读了那个问题。我想那我需要找到实现这些功能的替代方法吗?或者如果我的应用程序过于依赖 Spatial 内容,我应该尝试坚持使用以前的版本吗?
  • 如果应用程序严重依赖地理信息,我建议现在使用 EF 6。至少在一些拉取请求出现在该 github 问题下之前。
  • 谢谢!我可以再问几个包吗? System.Configuration 和 System.Web.Mvc,我使用 System.Configuration 中的 ConfigurationManager 和 System.Web.Mvc 中的一些视图类(例如,ViewEngineResult,ViewContext)。你知道我可以在哪里替换这些吗?
  • 配置管理发生了很大变化,并移至核心中的ConfigurationBuilderdocs.asp.net/en/latest/fundamentals/configuration.html。不确定 ViewEngineResult,我猜它已移至 Microsoft.AspNetCore.Mvc 命名空间。 docs.asp.net/projects/api/en/latest/autoapi/Microsoft/…
【解决方案4】:

编辑:

这里是带有 EF Core 的 NetTopologySuite 的官方文档(感谢 ono2012):

Spatial Data - EF Core


原帖:

2018 年 12 月 10 日更新

Entityframework Core 的更高版本现在支持使用 NetTopologySuite (see documentation) 的空间数据。我认为它从 2.1 开始就受支持,但我建议使用 2.2+,因为 2.1 中存在一个错误,即保存到数据库时坐标会反转。

您的项目需要以 .NET Core 2.1+(最好是 2.2+)为目标。

通过添加以下 nuget 包,我设法让它与 SQL Server 2016 一起使用:

Microsoft.AspNetCore.All
Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite

要在您的 DBContext 中使用它,您需要在您的 startup.cs 中添加以下选项:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<PMSdp3_Context>(o => 
                     o.UseSqlServer(connString, opt => opt.UseNetTopologySuite()));
        }

【讨论】:

  • 在第 1100 期找到这个 comment,将我带到 docs,它告诉您要下载哪个 NetTopologySuite NuGet 包以及如何使用它
【解决方案5】:

借助 Entity Framework Core 2.2,您可以使用 NetTopologySuite 空间库。

然后您可以执行如下查询:

var nearestCity = db.Cities
    .OrderBy(c => c.Location.Distance(currentLocation))
    .FirstOrDefault();

这里有一个完整的例子: https://www.markopapic.com/finding-nearby-users-using-ef-core-spatial-data/

【讨论】:

    【解决方案6】:

    我在 ASP.NET Core 项目中使用了using Microsoft.Spatial 来替代using System.Data.Entity.Spatial,它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2016-11-12
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多