SQL Geography 열을 dapper가있는 EF DbGeography 클래스에 매핑 할 수 없습니다.

c# dapper entity-framework sql sqlgeography

문제

SQL 데이터베이스에 sql geography 열이있는 테이블이 있습니다. EF6를 사용하여 데이터베이스에 대한 엔티티를 생성했습니다. 아시다시피 Entitiy Framework는 SQL Geography 유형에 대해 System.Data.Entity.Spatial.DbGeography 를 생성합니다. 쿼리를 실행하고 결과를 내 EF 생성 엔티티에 매핑하는 데 dapper를 사용하고 있습니다.

내 엔터티 클래스

public partial class Fix
{
    public Fix()
    {
        this.FixUsers = new HashSet<FixUser>();
    }

    public long FixID { get; set; }
    public long UserID { get; set; }
    public System.Data.Entity.Spatial.DbGeography Position { get; set; }
    public int Radius { get; set; }
    public System.DateTime CreatedDate { get; set; }

    public virtual MemberProfile MemberProfile { get; set; }
    public virtual ICollection<FixUser> FixUsers { get; set; }
}

예외를 throw하는 SQL 쿼리

    var fix = SqlConnection.Query<Fix>(@"SELECT TOP(1) 
                                         f.FixID as FixID, 
                                         f.UserID as UserID, 
                                         f.Radius as Radius, 
                                         f.CreatedDate as CreatedDate, 
                                         f.Position as Position
                                         FROM [Fix] f 
                                         WHERE f.FixID = @fixId", new { fixId }).FirstOrDefault();

다음은 예외 스냅 샷입니다.

여기에 이미지 설명을 입력하십시오.

기본적으로 dapper는 Microsoft.SqlServer.Types.SqlGeography 에 매핑하려고합니다.

여기에 해결 방법이 있습니까?

편집 됨

일부 솔루션을 찾았습니다. 엔티티의 부분 클래스를 만들었습니다.

public partial class Fix
{
    public string PositionString
    {
        set
        {
            Position = DbGeography.PointFromText(value, 4326);
        }
    }
}

내 검색어가 바뀌 었습니다.

var fix = SqlConnection.Query<Fix>(@"SELECT TOP(1) 
                                     f.FixID as FixID, 
                                     f.UserID as UserID, 
                                     f.Radius as Radius, 
                                     f.CreatedDate as CreatedDate, 
                                     f.Position.ToString() as PositionString
                                     FROM [Fix] f 
                                     WHERE f.FixID = @fixId", new { fixId }).FirstOrDefault();

전문가 답변

Dapper는 많은 공통 데이터 유형에 대한 내장 된 지원을 제공하지만 전부는 아닙니다. 사용자 지정 쿼리 매개 변수를 사용하는 것이 좋습니다. 이 커밋 에서 DataTable 과 같은 테이블 반환 매개 변수에 대한 사용자 지정 지원을 추가하는 방법을 확인할 수 있습니다. 나는 특히 EF와 같은 것들을 위해서 추가적인 의존성을 요구하는 것을 추가하는 것을 매우 꺼린다. 미래에 유용 할 수있는 것은 사용자 지정 공급자를위한 사용자 지정 가능한 등록 도구입니다 (매개 변수의 데이터를지도가있는 곳으로 이동시키는 것). 오늘은 존재하지 않습니다.


인기 답변

Dapper를 실제로 사용하려면 SqlGeography를 DbGeography로 변환 할 수 있습니다.

DbGeography.FromText(sqlGeo.ToString());

따라서 변환을 메모리에서 수행하거나 SQL을 EF와 함께 사용할 수도 있습니다.

dbContext.Fixes.SqlQuery("SELECT TOP(1) 
                                     f.FixID, 
                                     f.UserID, 
                                     f.Radius, 
                                     f.CreatedDate, 
                                     f.Position
                                     FROM [Fix] f 
                                     WHERE f.FixID = @fixId", new SqlParameter("fixId", fixId)).FirstOrDefault();

또는 Entity Framework를 일반적인 방법으로 사용합니까? 복잡한 쿼리가 아니기 때문에 :)

dbContext.Fixes.Find(fixId);

Dapper로 쿼리하여 EF에서 엔티티에 매핑하는 이유는 아직도 궁금합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.