首页 > 解决方案 > npgsql.EntityFrameworkCore.PostgreSQL - 带有 json 参数的执行函数不起作用

问题描述

数据库:PostgreSQL

ORM:带有 Npgsql.EntityFrameworkCore.PostgreSQL 的实体框架核心

试图将下面的功能传递产品列表调用为 json

dbContext.product.FromSqlRaw("SELECT pa.usp_set_product({0})", productjson).ToList();

返回错误为:“42883:函数 pa.usp_set_product(text) 不存在”

然后在下面尝试

dbContext.product.FromSqlRaw(@"SELECT pa.usp_set_product('" + productjson+ "')").ToList();

返回错误:“输入字符串的格式不正确”

然后在下面试了下效果很好

 using (var cmd = new NpgsqlCommand(@"SELECT pa.usp_set_product(@productjson)", conn))
   {
    cmd.Parameters.Add(new NpgsqlParameter("productjson", NpgsqlDbType.Json) { Value = productjson});
    cmd.ExecuteNonQuery();
   }

有什么想法,请-

  1. 为什么带有 JSON 参数的 FromSqlRaw 不起作用
  2. 使用 NpgsqlCommand 有什么缺点吗 - 它是否支持 Linux-container(docker)

谢谢,

@保罗

标签: c#dockerentity-framework-corenpgsqllinux-containers

解决方案


当你在 FromSqlRaw 中包含一个参数值时,它将作为默认对应的 PG 类型发送;我假设你productjson是一个 .NET 字符串,它映射到一个 PG text,而不是json. 结果与使用 NpgsqlCommand 的低级代码相同,但没有指定NpgsqlDbType.Json.

EF Core 还允许您传递 DbParameter 实例而不是原始值,因此您应该能够执行以下操作:

var jsonParam = new NpgsqlParameter("productjson", NpgsqlDbType.Json);

dbContext.product.FromSqlRaw("SELECT pa.usp_set_product(@jsonParam)", jsonParam).ToList();

此文档页面上提供了更多信息。

注意:永远不要将字符串连接或插入到 FromSqlRaw 的 SQL 中 - 这容易受到 SQL 注入的影响。仔细阅读EF 文档以获取更多信息。

注意 2:考虑使用 PostgreSQLjsonb类型而不是json. 您可以在此处阅读不同之处。


推荐阅读