無法使用dapper將SQL Geography列映射到EF DbGeography類

c# dapper entity-framework sql sqlgeography

我的SQL數據庫中有sql geography列表。我用EF6為我的數據庫生成了實體。如您所知,Entitiy Framework為SQL Geography類型生成System.Data.Entity.Spatial.DbGeography 。我正在使用dapper來運行查詢並將結果映射到我生成的EF實體中。

我的實體類

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; }
}

拋出異常的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

這裡有解決方法嗎?

EDITED

找到了一些解決方案,為我的實體創建了部分類

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());

所以只需在內存中進行轉換,或者也可以只使用帶有EF的SQL:

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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow