2013-02-25 5 views
1

Я создаю приложение с использованием платформы DotNetNuke 7 и пытаюсь записать данные географии в базу данных. Вот некоторые сведения о проекте. Я строю VS VS 2012 и только что обновлен до Server 2012 с 2008 R2. DotNetNuke 7 реализует PetaPoco для уровня данных и WebAPI.Нет сопоставления из типа объекта System.Data.Spatial.DbGoography для известного управляемого типа управляемого провайдера

Надеюсь, что я предоставил информацию, чтобы понять проблему. Мой код не работает в строке «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; } 
    } 

} 

Я проходящий в Лонге и Шире со стороны клиента из карты Google который получает COORDS от мыши нажмите

В моей базе данных, если Я должен был непосредственно написать вставку или обновление, используя следующее, это сработает.

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

В чем может быть причина?

- хотя я бы включил снимок экрана объекта enter image description here

+0

Не могли бы вы предоставить полную информацию об исключениях (включая трассировку стека), возвращаемый методом его ToString()? –

ответ

1

Я не уверен в этом, но идти по тому, как работать ORMs, я бы сказал, это потому, что 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 в своих классах. Я оставил публичный доступ и поставил сеттер как защищенный, но я не уверен ни в каких ограничениях, которые DAL2 имеет с классами сопоставления.

Редактировать Обновленный ответ после проведения дальнейших исследований и обратной связи

+0

Я думаю, что вы правы в отсутствии отображения, но, как говорит op, БД понимает тип, но использует его собственную функцию типа «точка из текста». В результате я надеялся, что будет способ создать сопоставление или предоставить его таким образом, чтобы SQL принимал. – dougajmcdonald

+0

Моя ошибка, я имел в виду, что DNN не знает, чтобы вызвать функцию «точка из текста» в sql, чтобы сопоставить объект DbGeography с типом данных типа sql. Я знаю, что Entity Framework знает, как это сопоставить. К сожалению, я сам не знаю, как делать пользовательские типы в DNN, поэтому, если вы найдете способ сделать это, было бы интересно знать :) –

+0

Приятный маленький трюк! Мне нужно было сделать это с помощью List . –

 Смежные вопросы

  • Нет связанных вопросов^_^