2016-08-02 112 views
5

我正在嘗試將ASP.NET MVC中的webform遷移到ASP.NET Core MVC。目前,我試圖找到一種方式來代替:ASP.NET Core中的System.Data.Entity.Spatial替換

using System.Data.Entity.Spatial; 

,因爲它不是目前.NET提供的核心或者我可能一直沒能找到它。

有沒有包含這個包的方法?也許通過NuGet包?

Ps。我簡要閱讀了微軟指南,但找不到與之相關的任何內容。對於任何人誰可能處於類似的情況,導遊是這裏: https://docs.asp.net/en/latest/migration/mvc.html

(很抱歉,如果我不能寫一個很好的問題,我想習慣了這裏的系統)

+0

可能的複製。 (空間數據 - 地理)](https://stackoverflow.com/questions/44873740/entity-framework-core-type-udt-is-not-supported-on-this-platform-spatial-data) – Eli

回答

9

您可以使用Microsoft.Spatialgeographygeometry空間操作。

OFC,EntityframeworkCore不支持空間,這樣你就不能創建在codefirst地理數據類型的字段,我建議你做這個用純SQL讚揚直到EntityframeworkCore支持在2017年第二季度(See this)空間。如果你不知道我會怎麼告訴你的。

  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,您可能需要使用System.Spatial程序包,也可以從Microsoft 。 –

0

這是純粹是因爲實體框架7不支持空間的東西。 還有。 你可以在這裏關注與它相關的github問題。現在 https://github.com/aspnet/EntityFramework/issues/1100

+0

我讀過問題昨天。我想我需要找到一種實現這些功能的替代方法?或者如果我的應用程序太依賴於Spatial的東西,我應該試着堅持以前的版本嗎? –

+0

如果應用程序嚴重依賴地理信息,我建議現在就使用EF 6。至少在這個github問題下出現一些pull請求。 –

+0

謝謝!我可以問幾個更多的包嗎? System.Configuration和System.Web.Mvc,我使用System.Configuration中的ConfigurationManager和System.Web.Mvc中的一些View類(例如,ViewEngineResult,ViewContext)。你知道我能在哪裏取代這些嗎? –

0

Entity Framework Core尚不支持空間數據。

空間不計劃2.0,我們還沒有完成後的版本計劃。在https://github.com/aspnet/EntityFramework/issues/1100處發佈更多關於空間支持的詳細信息可能是一個不錯的主意,例如,你是否使用特定的空間函數,或者是否需要具有各種空間功能的豐富空間類型,你只能將它與特定數據庫一起使用,還是需要針對多個數據庫編寫相同的代碼?等

Source: MSDN .NET Blog

我已經做了臨時解決方法包括地理柱,並用它在EF核心1.0.0及以上。這不是完美的,但它現在會做。 (以Hatef’s answer類似顯然,哇英雄所見略同,我猜。)

參見接受的答案:不支持這個平臺類型UDT:中[實體框架的核心Entity Framework Core: Type Udt is not supported on this platform. (Spatial Data - Geography)

相關問題