2013-02-25 40 views
1

我正在使用DotNetNuke 7平臺構建應用程序,並試圖將Geography數據寫入數據庫。以下是該項目的一些背景。我在VS 2012中構建,剛剛從2008 R2升級到Server 2012。 DotNetNuke 7爲數據層和WebAPI實現了PetaPoco。不存在從對象類型System.Data.Spatial.DbGeography到已知託管提供程序本機類型的映射

希望我提供的信息足以瞭解問題。我的代碼在行「rep.Insert(location);」

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Net; 
using System.Web; 
using System.Net.Http; 
using System.Web.Http; 
using System.Data.Spatial; 
using DotNetNuke.Web.Api; 
using DotNetNuke.Data; 


namespace DotNetNuke.Modules.GeoLocations 
{ 
    public class LocationController: DnnApiController 
    { 
     [AllowAnonymous] 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public HttpResponseMessage addLocation(CP_Location submitted) 
     { 

      submitted.GeoCode = DbGeography.PointFromText(string.Format("POINT({0} {1})", submitted.Long, submitted.Lat), 4326); 
      createLocation(submitted); 

      return Request.CreateResponse(HttpStatusCode.OK, "Success"); 
     } 



     //------------------------------CRUD------------------------------// 

     public void createLocation(CP_Location location) 
     { 
      using (IDataContext ctx = DataContext.Instance()) 
      { 
       var rep = ctx.GetRepository<CP_Location>(); 
       rep.Insert(location); 
      } 
     } 
    } 
} 

這是我的目標

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.Spatial; 
using System.Data.Entity; 

using DotNetNuke.ComponentModel.DataAnnotations; 
using DotNetNuke.Data; 
using DotNetNuke.Data.PetaPoco; 

namespace DotNetNuke.Modules.GeoLocations 
{ 
    [TableName("CP_Locations")] 
    [PrimaryKey("LocationId", AutoIncrement = true)] 
    public class CP_Location 
    { 
     public int LocationId { get; set; } 
     public string LocationType { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public float Long { get; set; } 
     public float Lat { get; set; } 
     public DbGeography GeoCode { get; set; } 
    } 

} 

我在長和緯度通過從一個谷歌地圖,從獲取鼠標座標中的客戶端點擊

在我的數據庫中,如果我將直接編寫插入或更新使用以下,它將工作。

geography:: STGeomFromText('POINT(-121.527200 45.712113)' , 4326); 

可能是什麼原因?

- 儘管我會包括對象 enter image description here

+0

能否請您提供完整的異常詳細信息(包括堆棧跟蹤)的答案,正如它的toString()方法返回? – 2013-09-26 13:05:32

回答

1

的屏幕截圖我不是這個肯定的,但要通過的ORM是如何工作的,我會說這是因爲PetaPoco不知道如何映射DbGeography對象到數據庫。您將不得不使用字符串值來嘗試並表示DBGeography。嘗試是這樣的:

[TableName("CP_Locations")] 
[PrimaryKey("LocationId", AutoIncrement = true)] 
public class CP_Location 
{ 
    public int LocationId { get; set; } 
    public string LocationType { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public float Long { get; set; } 
    public float Lat { get; set; } 
    [IgnoreColumn] 
    public DbGeography GeoCodeObj { 
     get { return DbGeography.FromText(GeoCode); } 
     set { GeoCode = value.AsText(); } 
    } 

    public string GeoCode { get; protected set; } 
} 

在你的數據庫,地理編碼數據類型應該是SQL地理type.The字符串將正確保存這種類型。然後你可以在你的類中自由使用GeoCodeObj。我已經公開了getter並將setter設置爲protected,但我不確定DAL2對映射類有任何約束。

編輯更新後進一步研究和反饋

+0

我認爲你是正確的缺乏映射,但正如op所說,數據庫確實理解類型,但使用它自己的「從文本點」類型函數。因此我希望有一種方法可以創建映射,或者以SQL可以接受的方式提供。 – dougajmcdonald 2013-09-23 17:24:27

+0

我的錯誤,我的意思是DNN不知道在sql中調用「從文本中的點」函數將DbGeography對象映射到sql位置數據類型。我知道實體框架確實知道如何映射它。不幸的是,我自己不知道如何在DNN中做自定義類型,所以如果你找到一種方法來做到這一點,知道:) – 2013-09-24 01:43:55

+0

好的小動作!我也需要使用List 來做到這一點。 – 2015-10-12 04:47:31

相關問題