我正在开发一个项目,在我的 .NET 5 应用程序中从 SQL Server 切换到 PostgreSQL。我必须对现有代码使用原始查询。这是我正在使用的 2 个软件包:
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0" />
这个功能很好用:
public async Task<ActionResult<List<LoadEntity>>> GetLoadByIdAsync(long id, CancellationToken cancellationToken)
{
var entity = await _dbContext.LoadEntities
.Where(e => e.LoadId == id)
.ToListAsync();
if (entity == null)
{
return NotFound();
}
return entity;
}
但是,如果我使用原始查询,它就会被破坏:
public async Task<ActionResult<List<LoadEntity>>> GetLoadByIdAsync(long id, CancellationToken cancellationToken)
{
var sqlQuery = $"SELECT * FROM Load WHERE LoadID = {0}";
var entity = await _dbContext.LoadEntities
.FromSqlRaw(sqlQuery, id)
.ToListAsync();
if (entity == null)
{
return NotFound();
}
return entity;
}
它抛出一个错误:
Npgsql.PostgresException(0x80004005):42P01:关系“tbload”不存在
在Npgsql.NpgsqlConnector.g__ReadMessageLong | 194_0(NpgsqlConnector连接器,布尔异步,DataRowLoadingMode dataRowLoadingMode,布尔readingNotifications,布尔isReadingPrepishedMessage)...
知道如何在 .NET Core 5 中使用 PostgreSQL 的原始查询吗?提前非常感谢!
根据您的查询,您正在尝试从“加载”表进行查询。
var sqlQuery = $"SELECT * FROM Load WHERE LoadID = {0}";
但是错误提到:
Postgres DB 不包含“tbload”表
这可能是在您的 DbContext 中,您将
LoadEntity
链接到 tbload
表。
确保相应的实体指向数据库中正确的表(名称)。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<LoadEntity>(entity =>
{
entity.ToTable("load");
...
});
...
}
此外,您使用
FromSqlRaw
的方式是不正确且不安全的。目前,您正在查询一个号码,这很好。想象一下,你有另一个查询需要使用 string/varchar/nvarchar 值进行查询,这可能会导致 SQL 注入攻击,例如查询用户数据、删除或删除表/数据库,你会很头疼。
但是,如果使用不当,FromSqlRaw 方法可能容易受到 SQL 注入攻击。请参阅下文了解更多详情。
建议使用参数化查询。
var idParameter = new SqlParameter("id", id);
var sqlQuery = "SELECT * FROM Load WHERE LoadID = @id";
var entity = await _dbContext.LoadEntities
.FromSqlRaw(sqlQuery, idParameter)
.ToListAsync();