ASP.NET Core中的System.Data.Entity.Spatial替换

Kem*_*siz 15 c# asp.net-core

我正在尝试将一个webform从ASP.NET MVC迁移到ASP.NET Core MVC.目前我正试图找到一种替代方法:

using System.Data.Entity.Spatial;
Run Code Online (Sandbox Code Playgroud)

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

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

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

(对不起,如果我写不出一个好问题,我想在这里习惯这个系统)

Hat*_*ef. 17

编辑

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

空间数据现已添加到EF Core 2.2(参见文档)


在EF Core 2.2版本之前使用它:

现在您可以使用Microsoft.Spatialfor geographygeometry空间操作.

ofc,EntityframeworkCore不支持空间,所以你不能在codefirst中创建一个具有地理数据类型的字段,我建议你用纯SQL做点赞,直到EntityframeworkCore2017年第二季度支持空间(见这个).如果你不知道我会怎么告诉你.

  1. 首先,您需要添加一个具有地理数据类型的字段,因此您需要在其中一个迁移类中运行此命令:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql("ALTER TABLE [dbo].[Cities] ADD [Location] geography");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您正在使用UnitOfWork,则可以在插入如下记录后更新"位置"字段:

        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);
        }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)

//最近城市的结果:

1.Tehran
2.Ankara
3.Paris
4.Washington DC

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