2016-08-02 7 views
5

ASP.NET MVCからASP.NET Core MVCにWebフォームを移行しようとしています。それは現在、.NETのコアでは使用できないのでASP.NET CoreのSystem.Data.Entity.Spatial置換

using System.Data.Entity.Spatial; 

するか、私はそれを見つけることができていないことがあります。現在、私は交換する方法を見つけようとしています。

このパッケージを含める方法はありますか?たぶんNuGetパッケージを介してですか?

ps。私はMicrosoftのガイドラインを簡単に読みましたが、それに関連するものは何も見つかりませんでした。似たような状況にあってもよい、誰のために、ガイドはここにある: https://docs.asp.net/en/latest/migration/mvc.html

(私は良い質問を書くことができなかった場合は申し訳ありませんが、私はここでシステムに慣れるためにしようとしています)

+0

可能な重複:タイプUDTは、このプラットフォームではサポートされていません。 (空間データ - 地理)](https://stackoverflow.com/questions/44873740/entity-framework-core-type-udt-is-not-supported-on-this-platform-spatial-data) – Eli

答えて

9

今、あなたはgeographygeometry空間操作のためのMicrosoft.Spatialを使用することができます。 EntityframeworkCoreはQ2 2017(See this)の空間をサポートするまで

OFC、あなたがcodefirstで地理データ型でフィールドを作成することはできませんのでEntityframeworkCoreは、空間的なサポートしていない、私はあなたが純粋なSQLでこれを行うことをお勧めは表彰します。もしあなたが私にあなたにどのように伝えるのか分からなければ。

あなたが ので、あなたは、移行までのクラスの一つにこの称賛を実行する必要があり、地理データ型でフィールドを追加するために必要なすべての
  1. まず:あなたはUnitOfWorkのあなたを使用している場合

    protected override void Up(MigrationBuilder migrationBuilder) 
    { 
        migrationBuilder.Sql("ALTER TABLE [dbo].[Cities] ADD [Location] geography"); 
    } 
    
  2. 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. そして今、あなたは近くの都市を検索する場合、あなたはこのCを使用することができます:あなたはこのようなレコードを挿入した後、[場所]フィールドを更新することができますommend:

    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.Tehran
2.Ankara
3.Paris
4.Washington DC

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

+0

Microsoft.Spatialの代わりに、MicrosoftのSystem.Spatialパッケージを使用することもできます。 –

0

ことがあります純粋にEntity Framework 7はSpatialのものをサポートしていないからです。 まだです。 ここに関連するgithubの問題に従うことができます。 https://github.com/aspnet/EntityFramework/issues/1100

+0

私はそれを読む昨日問題。私はその機能を実装する別の方法を見つける必要があると思いますか?また、アプリケーションがSpatialのものにあまりにも依存している場合は、前のバージョンに固執してください。 –

+0

アプリケーションがGeographyのものに大きく依存している場合は、今のところEF 6を使用することをおすすめします。そのgithubの問題の下で少なくともいくつかのプルリクエストが表示されるまで、少なくとも。 –

+0

ありがとう!いくつかのパッケージについて質問できますか? System.ConfigurationとSystem.Web.Mvc、System.ConfigurationのConfigurationManagerとSystem.Web.MvcのいくつかのViewクラス(例:ViewEngineResult、ViewContext)を使用しています。私はどこでこれらを置き換えることができるか知っていますか? –

0

空間データは、Entity Framework Coreではまだサポートされていません。

Spatialは2.0向けに計画されておらず、バージョンの計画を完了していません。空間サポートで何を望みたいかについての詳細をhttps://github.com/aspnet/EntityFramework/issues/1100に投稿するとよいでしょう。特定の空間関数を使用するか、あらゆる種類の空間機能を持つ豊富な空間型が必要ですか?これは特定のデータベースでのみ使用しますか、複数のデータベースに対して同じコードを記述する必要がありますか?など

Source: MSDN .NET Blog

私は地理列が含まれており、EFコア1.0.0以上でそれを使用するために一時的な回避策を行っています。それは完璧ではありませんが、今のところそれがあります。 (どうやらHatef’s answerと同様に、すごい偉大な心は似て、私は推測すると思います。)

に受け入れ答えを参照してください:[Entity FrameworkのコアのEntity Framework Core: Type Udt is not supported on this platform. (Spatial Data - Geography)

関連する問題