我有实体“点”,其中包含Id,文本和地理坐标。
CREATE TABLE [Point] (
[Id] INT IDENTITY CONSTRAINT [PK_Point_Id] PRIMARY KEY,
[Coords] GEOGRAPHY NOT NULL,
[Text] NVARCHAR(32) NOT NULL,
[CreationDate] DATETIME NOT NULL,
[IsDeleted] BIT NOT NULL DEFAULT(0)
)
CREATE PROCEDURE [InsertPoint]
@text NVARCHAR(MAX),
@coords GEOGRAPHY
AS BEGIN
INSERT INTO [Point](Text, Coords, CreationDate)
VALUES(@text, @coords, GETUTCDATE())
SELECT * FROM [Point] WHERE [Id] = SCOPE_IDENTITY()
END这是表的sql代码和插入的存储过程。我有使用dapper的类:
public class DapperRequester : IDisposable {
private readonly SqlConnection _connection;
private SqlTransaction _transaction;
public DapperRequester(string connectionString) {
_connection = new SqlConnection(connectionString);
_connection.Open();
}
public void Dispose() {
_connection.Close();
}
public void BeginTransaction() {
_transaction = _connection.BeginTransaction();
}
public void CommitTransaction() {
_transaction.Commit();
}
public void RollbackTransaction() {
_transaction.Rollback();
}
public void Query(string query, object parameters = null) {
Dapper.SqlMapper.Execute(_connection, query, parameters, transaction: _transaction);
}
public void QueryProc(string procName, object parameters = null) {
Dapper.SqlMapper.Execute(_connection, procName, parameters, commandType: CommandType.StoredProcedure, transaction: _transaction);
}
public IEnumerable<T> Execute<T>(string query, object parameters = null) {
return Dapper.SqlMapper.Query<T>(_connection, query, parameters, transaction: _transaction);
}
public IEnumerable<dynamic> ExecuteProc(string procName, object parameters = null) {
return Dapper.SqlMapper.Query(_connection, procName, parameters,
commandType: CommandType.StoredProcedure, transaction: _transaction);
}
public IEnumerable<T> ExecuteProc<T>(string procName, object parameters = null) {
return Dapper.SqlMapper.Query<T>(_connection, procName, parameters,
commandType: CommandType.StoredProcedure, transaction: _transaction);
}
}c#-class是:
public class Point
{
public int Id { get; set; }
public SqlGeography Coords { get; set; }
public string Text { get; set; }
}和存储库有方法
public Point InsertPoint(string text, SqlGeography coords)
{
using (var requester = GetRequester())
{
return requester.ExecuteProc<Point>("InsertPoint", new { text, coords }).FirstOrDefault();
}
}当我对任何其他类使用这样的系统时,一切都是正常的,但是映射有问题,我认为这是因为SqlGeography类型。使用:
SqlGeography coords = new SqlGeography();
coords = SqlGeography.Point(10.5, 15.5, 4326);
Point point = new Point { Coords = coords, Text = "Text" };
point = Repositories.PointRepository.InsertPoint(point.Text, point.Coords);我有一个异常的The member coords of type Microsoft.SqlServer.Types.SqlGeography cannot be used as a parameter value
映射该类型有什么秘诀吗?
发布于 2014-08-28 16:31:11
Dapper 1.32现在是includes direct support for this。您的代码现在应该可以简单地工作了。
发布于 2012-08-24 00:55:46
Dapper不支持DB提供程序特定的数据类型。在你的例子中,它是地理位置。
sqlite没有特定于数据库的实现细节,它适用于所有.net ado提供程序,包括sqlite、sqlce、firebird、oracle、MySQL和SQL Server
为了使用Dapper处理此参数,您必须编写自己的处理程序。有关示例,请参阅此answer。
祝好运
发布于 2013-02-16 00:27:14
我遇到了类似的问题。我发现Dapper可以很好地将结果字段映射到Microsoft.SqlServer.Types.SqlGeography,但使用它们作为参数不起作用。
我已经修改了SqlMapper.cs文件以包含对此类型的支持。你可以在这里看到要点:https://gist.github.com/bmckenzie/4961483
单击“修订”查看我所做的更改。
https://stackoverflow.com/questions/12090549
复制相似问题