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

时间:2016-08-02 18:45:36

标签: asp.net-core

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

var app = angular.module('MyApp', []);
app.service('PostService', function($http) {
    return{
        success: function(user) {
            return $http.post('process3.php', user);
        }
    };
});
app.controller('MyCtrl', ['PostService', function(PostService) {
    var self = this;
    self.user = {};
    self.submit = function() {
        PostService.success(self.user).then(function(data) {
        console.log(data.data);
    });
    };
}]);

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

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

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

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

5 个答案:

答案 0 :(得分:17)

修改

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

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

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

现在,您可以使用Microsoft.Spatial进行geographygeometry空间操作。

ofc,EntityframeworkCore不支持空间,因此您无法在codefirst中创建具有地理数据类型的字段,我建议您使用纯SQL表示,直到EntityframeworkCore在2017年第2季度支持空间(See this)。如果你不知道我将如何告诉你。

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

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql("ALTER TABLE [dbo].[Cities] ADD [Location] geography");
    }
    
  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);
        }
    
  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);
    
  4.   

    //最近城市的结果:

         

    1.Tehran
      2.Ankara
      3.Paris
      4.华盛顿特区

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

答案 1 :(得分:1)

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

  

没有为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)

答案 2 :(得分:0)

纯粹是因为实体框架7不支持Spatial内容。的然而即可。 您可以在此处关注与其相关的github问题。 https://github.com/aspnet/EntityFramework/issues/1100

答案 3 :(得分:0)

编辑:

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

Spatial Data - EF Core


原始帖子:

更新2018-12-10

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

您的项目需要针对.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()));
        }

答案 4 :(得分:0)

使用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/