如何在 .NET Core 5 中将实体框架原始查询与 PostgreSQL 结合使用?

问题描述 投票:0回答:1

我正在开发一个项目,在我的 .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 的原始查询吗?提前非常感谢!

c# postgresql entity-framework .net-core
1个回答
0
投票

根据您的查询,您正在尝试从“加载”表进行查询。

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();
© www.soinside.com 2019 - 2024. All rights reserved.