实体框架可以在不访问 sp_executesql 的情况下执行存储过程吗?

Posted

技术标签:

【中文标题】实体框架可以在不访问 sp_executesql 的情况下执行存储过程吗?【英文标题】:Can Entity Framework execute stored procedures without access to sp_executesql? 【发布时间】:2022-01-08 03:42:40 【问题描述】:

大家好,

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

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

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

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

【问题讨论】:

为什么需要一个存储过程来执行动态生成的 SQL?你真的需要这种能力吗?无需使用 SP 即可在客户端完成。 也许我应该改写一下。我试图使用动态生成的 sql。我正在尝试通过实体框架调用我同事的 SP,这样我就不必重做他们的所有工作。 【参考方案1】:

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

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

或:

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

SqlQuery 返回一个延迟加载的IEnumerable<T>

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于实体框架可以在不访问 sp_executesql 的情况下执行存储过程吗?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用实体框架的多对多中插入记录

在不使用其他项目的情况下添加实体框架核心迁移

部署和配置 ODP.NET 以在不安装实体框架的情况下工作

如何让实体框架在不保存对象的情况下创建/更新数据库表

实体框架6在不需要时复数表名

如何在不违反主键约束的情况下插入具有循环引用的实体框架