使用 EF Core 和 SQL Server 执行原始 SQL 查询 - System.Data.SqlClient.SqlException: '找不到存储过程 'Core.SetContextInfo'

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

我在 ASP.NET Core 项目中使用 EF Core 7。当它是实际的 SQL 查询时,EF Core 的

FromSql
方法认为提供的参数是存储过程的名称。如何让它运行选择查询并检索结果?

根据 EF Core 文档,我需要使用

FromSql
FromSqlInterpolated
方法通过原始 SQL 输入执行
SELECT
操作。但是,当我使用
FromSql
时,我收到错误:

Microsoft.Data.SqlClient.SqlException 找不到存储过程“SELECT * FROM dbo.Country”

这个简单的测试查询 (

SELECT * FROM dbo.Country
) 当我在 SSMS 中运行时运行良好。然而,由于某种原因,EF Core 认为这是存储过程的名称,并尝试查找存储过程,这显然失败了。

我尝试查看

FromSql
方法是否具有重载,用于指定字符串参数是实际查询还是存储过程的名称,但这似乎不可能。看起来该方法只接受单个字符串参数,并以某种方式在内部决定所提供的参数是存储过程还是查询。

文档页面上,很明显

FromSql
能够将实际查询作为输入。

这是我收到错误的代码(参数是

SELECT * FROM dbo.Country
):

public async Task<List<T>> RunRawSql(string query)
{
    try
    {
        var a = _context.Set<T>().FromSql($"{query}");
        return a.ToList();
    }
    catch (Exception ex)
    {
        return null;
    }
}
sql-server asp.net-core entity-framework-core ef-code-first
1个回答
0
投票

问题是

FromSql
方法不允许参数化实际的数据库模式(表名、列名等)。就我而言,我将查询作为一个整体,它属于参数化数据库模式的类别,因此
FromSql
不起作用。显然,如果您需要参数化模式,则必须使用
FromSqlRaw
来代替。

请注意,

FromSqlRaw
容易受到SQL注入攻击,因此您应该尽可能使用
FromSql
FromSqlInterpolated
。您必须注意切勿将任何用户输入发送到此处。不过,只要将此方法与任何用户输入完全解耦,使用
FromSqlRaw
就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.