0

我的 SQL 数据库中有带有 sql geography 列的表。我已经使用 EF6 为我的数据库生成了实体。如您所知,实体框架System.Data.Entity.Spatial.DbGeography为 SQL 地理类型生成。我正在使用 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.

这里有什么解决方法吗?

已编辑

找到了一些解决方案,为我的实体创建了部分类

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

2 回答 2

0

如果你真的想使用 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();

或者只是以正常方式使用实体框架?因为这不是一个复杂的查询:)

dbContext.Fixes.Find(fixId);

我仍然很好奇你为什么用 Dapper 查询然后将其映射到 EF 中的实体

于 2014-06-04T08:37:38.020 回答
0

Dapper 内置了对许多常见数据类型的支持,但不是全部。您可能会考虑使用自定义查询参数 - 您可以从这个提交中看到如何添加对表值参数的自定义支持作为DataTable. 我非常不愿意添加任何需要额外依赖项的东西,尤其是对于像 EF 这样的东西。将来可能有用的是自定义提供程序的可自定义注册工具(允许参数中的数据是任何东西 - 移动地图发生的地方)。不过,这在今天不存在。

于 2014-06-04T09:21:44.057 回答