如何使用dapper将DbGeography插入到SQL Server中

6

我使用 System.Data.Entity.Spatial 创建了模型。

public class Store
{
    public int Id { get; private set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public DbGeography Location { get; set; }
}

插入到数据库

using (SqlConnection conn = SqlHelper.GetOpenConnection())
{
    const string sql = "INSERT INTO Stores(Name, Address, Location) " + 
                       "VALUES (@Name, @Address, @Location)";
    return conn.Execute(sql, store);                                
}

我遇到了一个异常:type System.Data.Entity.Spatial.DbGeography cannot be used as a parameter value
我已经尝试搜索了一些插入方法,这个是我能找到的最好的方法,但它只尝试插入一个参数,那么如果要插入一个具有dbgeography成员的对象应该怎么办?
更新 #1
我放弃了尝试去绕过或扩展东西,因为我对dapper非常陌生,而且时间不允许。我回到基础知识,这样做,因为我并不需要非常频繁地插入地理数据类型。
using (SqlConnection conn = SqlHelper.GetOpenConnection())
        {
            var sql = "INSERT INTO Stores (Name, Address, IsActive, Location, TenantId) " +
                      "VALUES('@Name', '@Address', @IsActive, geography::Point(@Lat,@Lng, 4326), @TenantId);";

            return conn.Execute(sql, new 
            { 
                Name = store.Name, 
                Address = store.Address, 
                IsActive = store.IsActive,
                Lat = store.Location.Latitude.Value,
                Lng = store.Location.Longitude.Value,
                TenantId = store.TenantId
            });             
        }
1个回答

2

添加对核心ADO.NET程序集之外类型的直接支持存在问题,因为它要么强制进行大量基于名称的反射,要么增加依赖项(并导致版本问题)。在这里使用 IDynamicParameters 不是必要的(甚至不合适),而是可以使用 ICustomQueryParameter 来表示单个参数。没有现有的特殊情况检测 DbGeography ,所以除非有库更改,否则您需要执行类似以下操作:

return conn.Execute(sql, new {
    store.Name, store.Address, Location=store.Location.AsParameter()
});

AsParameter() 是一个扩展方法,返回一个实现了 ICustomQueryParameter 接口并适当添加的对象。


编辑:请查看这里以获取更新信息:https://dev59.com/54Dba4cB1Zd3GeqPKvP9#24408529


我已经更新了问题,并且有第二部分的问题,我意识到这同样具有问题性,即从数据库中查询数据并将其绑定回MVC。https://dev59.com/54Dba4cB1Zd3GeqPKvP9 - Lee Gary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接