gpt4 book ai didi

c# - Entity Framework 和存储过程

转载 作者:太空狗 更新时间:2023-10-30 00:28:04 25 4
gpt4 key购买 nike

我注意到在 Entity Framework 设计器中,您可以为插入、更新和删除操作映射存储过程。是否也有任何方法可以为 Select 操作执行此操作,或者是否有数据库访问代码的新方向,我们不再真正为我们的基本选择操作编写存储过程?

我工作的公司非常坚持始终对每个数据库操作使用存储过程,即使 Entity Framework 通过调用 sp_executesql 使调用安全。

LINQ to SQL 和 Entity Framework 似乎都不再使用存储过程来选择数据。这是一个准确的陈述吗?

只是为了澄清我的问题:

我的数据库中有一个名为 Product 的表。我使用 Entity Framework 中的向导来生成我的模型......所以我现在有一个名为 Product 的实体。当我执行以下查询时:

db.Products.SingleOrDefault(p => p.Id == 1);

它生成的代码类似于:

EXEC sp_executesql N'SELECT * FROM Product'

当我真的想做这样的事情时:

EXEC up_GetProduct @Id = 1

如果使用 SingleOrDefault 无法做到这一点,我也无所谓。我宁愿有以下内容:

db.Products.GetProduct(1);

这是通常做的事情还是大多数人只是让它动态生成 SQL?

最佳答案

实体本身不允许使用存储过程进行选择。有几个原因。在我的脑海中:

  1. 您将如何向存储过程添加 where 子句?您要么必须使用 LINQ to Objects 执行此操作并且查询效率低下,要么能够以某种方式将自定义映射添加到存储过程属性。虽然并非不可能,但它肯定会引入一些实现复杂性。
  2. 实体可以具有用于在查询中进行连接的关系。使用存储过程,您再次遇到类似的问题。如果您有 OrderOrderItem 表,您如何加入?您可以运行 SelectOrder 并针对每个订单运行 SelectOrderItem(1+n 查询),或者使用一个返回两者的存储过程,作为具有重复 的结果集>Order 数据,或两个结果集。然后你必须指定它如何映射到实体。如果您必须手动指定映射,就会违背您必须设置的实体关系的目的。
  3. 你如何进行分页?使用 LINQ to Entities,您可以将 IQueryable 公开给业务层或 UI 层(由您决定)。然后执行 LINQ 过滤,修改 SQL 并使其高效。使用存储过程,您将不得不再次以某种方式手动定义所有这些,或者使用 LINQ to objects 进行过滤。
  4. LINQ 允许您选择新的 { o.Column1, o.Column2 }。这会生成仅选择您需要的那两列的 SQL。如果您有 BLOB/VARCHAR(MAX),则非常有用。使用存储过程,您通常会返回每一列(在很多方面都是浪费)。您可以拆分为 GetOrderDetailMainGetOrderDetailImages(或类似的)存储过程,但创建每个组合是不可行的。

在我看来,如果您要使用 EF 框架,让它为您执行 CRUD。将存储过程用于复杂的逻辑,例如全文搜索、太慢的特定查询等。否则您不会从中获益太多。

编辑:存储过程当然有好处。它们是预解析/预编译的,定义良好的“数据库 API”,您不需要授予对表的访问权限(尽管使用 SP CRUD,您实际上可以做同样的事情),更容易调试/调整查询,更容易了解 哪些查询需要调优,可以进行批处理等。但是,对于简单的 CRUD,您必须问问自己,存储过程的实现/管理开销是否值得。

关于c# - Entity Framework 和存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4108356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com