如何通过dapper将C#对象模型作为类型传递给postgresql函数
我试图通过dapper将C#对象模型作为postgresql类型传递给function,但出现以下错误: System.NotSupportedException:Npgsql或PostgreSQL本机不支持CLR类型System.Data.DataTable。要将其与PostgreSQL组合一起使用,您需要指定DataTypeName或对其进行映射,请参阅文档 我的postgresql类型是带有url属性的如何通过dapper将C#对象模型作为类型传递给postgresql函数,c#,postgresql,dapper,C#,Postgresql,Dapper,我试图通过dapper将C#对象模型作为postgresql类型传递给function,但出现以下错误: System.NotSupportedException:Npgsql或PostgreSQL本机不支持CLR类型System.Data.DataTable。要将其与PostgreSQL组合一起使用,您需要指定DataTypeName或对其进行映射,请参阅文档 我的postgresql类型是带有url属性的image 这是我在postgresql中的函数: CREATE OR REPLACE
image
这是我在postgresql中的函数:
CREATE OR REPLACE FUNCTION public.createapp(applicationid text, images image)
RETURNS void
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
INSERT INTO app
(
id,
applicationid,
images
)
VALUES
(
uuid_generate_v4(),
applicationid,
images
);
END
$BODY$;
我的图像模型是:
public class Image
{
public string Url { get; set; }
}
这是我的C#Dapper存储库代码:
var parameters = new DynamicParameters();
parameters.Add("applicationid", application.ApplicationId);
parameters.Add("images", application.Images);
var result = await GetDb().QueryFirstOrDefaultAsync("createapp", parameters, commandType: CommandType.StoredProcedure);
如何将此参数传递给我的函数?您需要在启动时注册自定义类型,如下所示:
SqlMapper.AddTypeHandler(new PgTypeHandler<SomeType>());
SqlMapper.AddTypeHandler(新的PgTypeHandler());
然后在sql脚本参数中定义类型,如下所示:
@图像::sometype
internal class PgTypeHandler<T> : SqlMapper.TypeHandler<T>
{
public override T Parse(object value)
{
return (T)value;
}
public override void SetValue(IDbDataParameter parameter, T value)
{
parameter.Value = value;
}
}
内部类PgTypeHandler:SqlMapper.TypeHandler
{
公共重写T解析(对象值)
{
返回(T)值;
}
公共覆盖无效设置值(IDbDataParameter参数,T值)
{
参数值=值;
}
}
更多文件:
我通过在startup.cs中添加MapComposite解决了这个问题:
NpgsqlConnection.GlobalTypeMapper.MapComposite(“图像”);
那是我的postgresql类型