[英]Instantiate Npgsql.EntityFrameworkCore.PostgreSQL's DbContext directly
[英]npgsql.EntityFrameworkCore.PostgreSQL - execute function with json parameter is not working
数据库:Postgresql
ORM:实体框架核心与 Npgsql.EntityFrameworkCore.PostgreSQL
试图将以下功能通过产品列表称为 json
dbContext.product.FromSqlRaw("SELECT pa.usp_set_product({0})", productjson).ToList();
返回错误为:“42883:function 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();
}
有什么想法,请-
谢谢,
@保罗
当你在 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:考虑使用 PostgreSQL jsonb
类型而不是json
。 您可以在此处阅读不同之处。
您是否有理由不使用 LINQ 进行查询? 对于您需要的大多数查询,它更容易、被广泛使用和优化。 如果您创建一个 Product 实体,它看起来像这样:
DbContext.Products.Add(new Product() { ProductName = "Test Product", Weight = 5, ... }
await DbContext.SaveChangesAsync();
然后,如果您想检索 id 为 productId 的产品:
Product product = await DbContext.Products.FirstOrDefaultAsync(p => p.Id == productId);
您需要所有已删除的产品吗?
List<Product> deletedProducts = await DbContext.Products.Where(p => p.DeletionTime != null).ToListAsync();
(这些示例依赖于您向 Product 实体添加所需的属性,例如 Id 和 DeletionTime)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.