SQLジオグラフィー列を、Dpperを使用して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; }
}

例外をスローする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にマップしようとしていると思い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このコミットから、テーブル値のパラメータのカスタムサポートをDataTableとして追加する方法がわかり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);

私はまだあなたがEFからエンティティにマップするためにDapperを使ってクエリを行うのはなぜか不思議です



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow