2013-02-25 4 views
1

DotNetNuke 7 플랫폼을 사용하여 응용 프로그램을 작성 중이며 데이터베이스에 지리 데이터를 쓰려고합니다. 다음은 프로젝트의 배경입니다. 저는 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); 

어떤 이유 일 수 있습니까?

- 나는으로 ORMs의 작동 방식에 의한 화면 나는이에 확실하지 오전 개체 enter image description here

+0

당신이 (스택 추적 포함) 전체 예외 세부 정보를 제공시겠습니까 피드백 후 답을 업데이트? –

답변

1

샷 만가는이 포함됩니다 불구하고, 나는 그것이 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; } 
} 

데이터베이스에서를, 지오 코드 데이터 형식 type.The 문자열이 제대로이 유형에 저장됩니다 SQL 지리해야합니다. 그런 다음 클래스에서 GeoCodeObj를 자유롭게 사용할 수 있습니다. 나는 getter를 public으로 남겨두고 setter를 protected로 두었지만, DAL2가 매핑 클래스에 어떤 제약이 있는지 확실하지 않습니다.

편집는 ToString() 메소드에 의해 반환, 추가 연구 및

+0

당신이 매핑의 부족에 맞다고 생각하지만, op가 말했듯이, DB는 타입을 이해하지만 그것을 사용합니다. 결과적으로 매핑을 만들거나 SQL이 받아 들일 수있는 방식으로 제공 할 수있는 방법이 있기를 바랬습니다. – dougajmcdonald

+0

실수로, DNN에서 SQL의 '텍스트에서 포인트'함수를 호출하여 DbGeography 객체를 SQL 위치 데이터 유형에 매핑한다는 사실을 알았습니다. Entity Framework가 이것을 매핑하는 방법을 알고 있다는 것을 알고 있습니다. 불행히도 나 자신은 DNN에서 사용자 정의 유형을 수행하는 방법을 모릅니다. 그렇게 할 방법을 찾으면 알아두면 재미있을 것입니다. –

+0

Nice little trick! List 를 사용하여이 작업을 수행해야했습니다. –