何时在 Entity Framework Code First 中使用存储过程和 SQL 查询

When to use stored procedures and SQL queries in Entity Framework Code First

在 EF 代码优先中,特别是在 ASP.NET Web 开发中,存储过程和 SQL 查询的适当用途是什么?在开始使用 Entity Framework 之前,我非常依赖它们。但是,有了 Entity Framework,希望我们不需要担心编写 SQL 和创建存储过程来创建、插入、更新和读取数据等

我知道在某些情况下使用 SQL 在 EF 中可能会很好,例如清除整个 table 时:

dbcontext.Database.ExecuteSqlCommand("delete from MyTable");

我不想低估存储过程和 SQL 查询的可用性,并且想了解它们在 EF 代码优先应用程序中可能有用的场景。您能否分享您自己项目中的良好做法?

很少(<0.1%)您会遇到使用存储过程的情况,其余 99.9% 的情况下您应该使用 ORM 或 entity framework。

以下是我使用存储过程的几个实例。

i) 全文搜索 与 Google 类似,具有复杂的要求,如邻近搜索、分词器、词干分析器、INFLECTIONAL 等

ii) 某些 table 列是 加密的 ,并且您在条件语句中查询这些列。

iii) 对于数据库到数据库的迁移,sql 作业等

可能还有其他几个我现在想不起来了。

在我的 意见 中,我认为有很多时候您可能需要做一些非常复杂的事情,这需要在存储过程中保持这种复杂性。

一些示例可能包括;

  • BULK INSERT 用户上传文件的操作要处理
  • 递归 CTE
  • 使用 Temp Tables/Table 变量执行高级处理
  • 利用现有的数据库功能、过程、链接服务器等
  • 查询足够高级以至于使用 ORM 生成的查询计划不是最佳的实例,并且您知道您可以使用普通 SQL 做得更好。也能够在 SQL 中使用查询提示是非常有益的(尽管也很少见)

我过去参与过一些项目,我们让 ORM 处理绝大多数实例,但在少数地方我们推迟到手工制作 SQL合适的。

我不建议任何 ORM 都适合 所有 任务。

在某种程度上,我还建议您的开发团队的能力也可以帮助您决定在何处使用什么。您的 ORM 可能适用于简单的 CRUD 和半高级搜索类型查询。然而,对于更复杂的处理,如果你的团队要花两倍的时间在 ORM 中尝试做某事而不是简单地在 SQL 中做,那么你必须问这是否是对时间和金钱的良好利用.