Entity Framework 可以在不访问 sp_executesql 的情况下执行存储过程吗?

Can Entity Framework execute stored procedures without access to sp_executesql?

大家好,

我继承了多个桌面应用程序,这些应用程序严重依赖存储过程进行数据操作。这些应用程序是用 VB6 编写的,我目前正在尝试弄清楚如何将它们移植到 .Net 5 或 .Net 6。

我了解 Entity Framework Core 能够执行存储过程。但是,在 video I watched recently 中,我了解到 Entity Framework 核心通过存储过程 sp_executesql 执行数据函数,以允许执行开发人员可能动态生成的任何过程。

但是,正如上面链接的视频中提到的,这为桌面应用程序带来了安全漏洞。要触发 sp_executesql,桌面应用程序的用户必须拥有可以在其系统上触发它的凭据。这些值可能被加密,但加密并非无懈可击。

如果我创建和使用无法访问 sp_executesql 但可以访问我的同事创建的存储过程的数据库凭据,Entity Framework 是否能够触发后者?

您可以使用“原始 SQL 查询”直接执行存储过程,而不需要 sp_executesql:

var customers = context.Customers.SqlQuery("dbo.sp_getcustomers");

或:

var customers = context.Customers.SqlQuery("dbo.sp_getcustomerbyid @p1", customerID);

SqlQuery returns 延迟加载 IEnumerable<T>.

顺便说一句,原始 SQL 查询不仅用于调用存储过程,而且非常有用。与其完全依赖 Entity Framework 的 SQL 生成机制(有时会产生次优的 SQL),您可以执行任意的、格式良好的 SQL 语句自己选择,直接。

进一步阅读:
Raw SQL Queries (EF6)
Database.SqlQuery Method

If I create and utilize database credentials that do not have access to sp_executesql, but do have access to the stored procedures my colleagues have made, will Entity Framework be capable of firing the latter?

这个问题的前提是双重缺陷。

  1. sp_executesql 可供所有用户使用,并且不存在任何类型的安全漏洞。您的用户将有权访问 sp_executesql.

  2. EF 并非 实际上 调用 sp_executesql。它将存储过程作为 RPC 而不是 TSQL 批处理调用。这是内置的 TDS protocol functionality。但是探查器使用 sp_executesql 将 RPC 调用显示为 TSQL 批处理,以便您可以将调用复制并粘贴到查询 window 中进行测试。