如何使用dapper将DbGeography插入SQL Server
我using System.Data.Entity.Spatial;
创建了模型using 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); }
我得到exceptiontype System.Data.Entity.Spatial.DbGeography cannot be used as a parameter value
我试过寻找插入的方法, 这是我能找到的最好的,但是它试图只插入一个参数,我该怎么做才能插入一个有dbgeography成员的对象?
更新#1
我已经放弃了试图破解或扩展的东西,因为我对新手来说很新,时间不在我身边。 我回到基本这样做,因为我不需要非常频繁地进行地理数据类型插入
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 }); }
为核心ADO.NET程序集之外的类型添加直接支持是有问题的,因为它要么强制进行大量基于名称的reflection,要么膨胀依赖项(并导致版本控制问题)。 这里使用IDynamicParameters
不是必需的(甚至是适当的IMO) – 相反, ICustomQueryParameter
可用于表示单个参数。 DbGeography
没有现有的特殊情况检测,因此除非有库更改 , 否则您必须执行以下操作:
return conn.Execute(sql, new { store.Name, store.Address, Location=store.Location.AsParameter() });
其中AsParameter()
是一个扩展方法,它返回一个适当添加它的ICustomQueryParameter
实现。
编辑:请参阅此处获取更新: https : //stackoverflow.com/a/24408529/23354