我创建了模型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);
}
我得到例外type System.Data.Entity.Spatial.DbGeography cannot be used as a parameter value
我已尝试搜索插入的方法,this是我能找到的最好的,但它只尝试插入1个参数,我该怎么做才能插入一个对象有dbgeography成员吗?
我已经放弃了试图破解或扩展内容,因为我对新手来说非常新,时间不在我身边。我回到基本这样做,因为我不需要频繁地进行地理数据类型插入
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
});
}
答案 0 :(得分:1)
为核心ADO.NET程序集之外的类型添加直接支持是有问题的,因为它会强制进行大量基于名称的反射,或者会增加依赖项(并导致版本控制问题)。这里使用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