ASP.NET Core での System.Data.Entity.Spatial の置き換え 質問する

ASP.NET Core での System.Data.Entity.Spatial の置き換え 質問する

Web フォームを ASP.NET MVC から ASP.NET Core MVC に移行しようとしています。現在、次のものを置き換える方法を探しています:

using System.Data.Entity.Spatial;

現時点では .NET Core では利用できないため、見つけられなかった可能性があります。

このパッケージを組み込む方法はありますか? NuGet パッケージ経由で組み込むことは可能でしょうか?

Ps. Microsoft のガイドラインを簡単に読みましたが、関連するものは見つかりませんでした。同様の状況にある人のために、ガイドを次に示します。https://docs.asp.net/en/latest/migration/mvc.html

(良い質問を書けなかったらごめんなさい。ここのシステムに慣れようとしているところです)

ベストアンサー1

編集

この機能はEF Core 2.2の新機能です

空間データがEF Core 2.2に追加されました(ドキュメントを参照


EF Core 2.2 より前のバージョンでは、以下を使用します。

Microsoft.Spatialこれで、 forgeographyおよびgeometry空間演算を使用できるようになりました。

もちろん、EntityframeworkCore空間をサポートしていないため、コードファーストで地理データ型のフィールドを作成することはできません。EntityframeworkCore2017年第2四半期に空間をサポートするまで、純粋なSQLコマンドでこれを行うことをお勧めします(これを見て)。方法が分からない場合はお教えします。

  1. まず、地理データ型のフィールドを追加する必要があるため、移行の上位クラスの 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.ワシントンDC

覚えておいてください! 地理データ タイプのフィールドを除くすべてのレコードを選択する必要があります。

おすすめ記事