phq*_*hqb 3 c# postgresql npgsql dapper nettopologysuite
我使用 Dapper (使用npgsql带有插件的数据提供程序NetTopologySuite)来调用带有参数的 PostgreSQL 函数geography,然后收到一个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
...
Run Code Online (Sandbox Code Playgroud)
但当我使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它SqlMapper.AddTypeHandler(new GeographyTypeMapper());,一切正常。
| 归档时间: |
|
| 查看次数: |
2609 次 |
| 最近记录: |