c# - 使用 Dapper 调用带有地理参数的 PostgreSQL 函数时出现 NotSupportedException
问题描述
我正在使用 Dapper(使用npgsql
带有插件的数据提供程序NetTopologySuite
)调用带有geography
参数的 PostgreSQL 函数,然后收到NotSupportedException
:
System.NotSupportedException: The member _location of type NetTopologySuite.Geometries.Point cannot be used as a parameter value
at Dapper.SqlMapper.LookupDbType(Type type, String name, Boolean demand, ITypeHandler& handler) in C:\projects\dapper\Dapper\SqlMapper.cs:line 417
at Dapper.SqlMapper.CreateParamInfoGenerator(Identity identity, Boolean checkForDuplicates, Boolean removeUnused, IList`1 literals) in C:\projects\dapper\Dapper\SqlMapper.cs:line 2516
at Dapper.SqlMapper.GetCacheInfo(Identity identity, Object exampleParameters, Boolean addToCache) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1707
at Dapper.SqlMapper.ExecuteScalarImplAsync[T](IDbConnection cnn, CommandDefinition command) in C:\projects\dapper\Dapper\SqlMapper.Async.cs:line 1207
...
但是当我使用NpgsqlCommand
通过AddWithValue
方法指定的类型时它工作正常。
我怎样才能使 Dapper 映射NetTopologySuite.Geometries.Point
到geography
?
解决方案
做了一些搜索后,我找到了一个不被接受的答案,解决了我的问题。
确保我添加了Npgsql.NetTopologySuite包并启用connection.TypeMapper.UseNetTopologySuite();
了它的映射器,然后 ADO.Net 命令可以正常工作。
我添加了一个自定义Dapper.SqlMapper.TypeHandler
:
public class GeographyTypeMapper : SqlMapper.TypeHandler<Geometry> {
public override void SetValue(IDbDataParameter parameter, Geometry value) {
if (parameter is NpgsqlParameter npgsqlParameter) {
npgsqlParameter.NpgsqlDbType = NpgsqlDbType.Geography;
npgsqlParameter.NpgsqlValue = value;
} else {
throw new ArgumentException();
}
}
public override Geometry Parse(object value) {
if (value is Geometry geometry) {
return geometry;
}
throw new ArgumentException();
}
}
然后使用它SqlMapper.AddTypeHandler(new GeographyTypeMapper());
,一切正常。
推荐阅读
- .net - 如何在 .NET 中加载证书请求并从中创建证书
- node.js - 如何阻止 Cloud Firestore 触发器相互覆盖?
- javascript - 我不能在 TypeScript 中使用 useContext Hook
- python - Beautiful Soup - XML 解析 - 属性错误异常(处理空值)
- azure - 管理用于暂存和生产的 Azure 应用服务中的 Docker 映像
- r - R:write.table 的异常输出
- python - 无法再使用“python”在 PowerShell 或控制台中启动 Python 解释器,需要输入“py”
- python - 将列表中每个元素的长度与 Python 中的某个数字进行比较
- flutter - 警报框中的颤振导航器不起作用
- asp.net-core - 如何从控制器中提取方法?