你陷入了一个逻辑谬误。仅仅因为 EF 旨在以某种方式工作并不意味着您不应该以不同的方式进行操作。仅仅因为 EF 可能不适合以某种方式做某件事并不意味着 EF 很糟糕或不应该用于任何事情。这是全有或全无的论点。如果它不能完美地完成所有事情,那么它就是无用的......这不是真的。
EF 是一个对象关系映射工具。仅当您想将数据作为对象处理时才使用它。如果您想将数据作为关系集(又名 SQL)处理,则不会使用它。
您也不会坚持使用 EF 或什么都不用。您可以使用 EF 进行查询,并使用存储的过程进行更新。或者反过来。这是关于使用最适合给定情况的工具。
不,EF 不仅仅适用于“简单”或“琐碎”的事情。但是,将它用于更复杂的场景通常需要更深入地了解 EF 的工作原理,以便您了解它在幕后所做的事情。
在 EF 中使用存储过程就像说MyContext.Database.ExecuteSqlCommand()
or一样简单MyContext.Database.SqlQuery()
。这是最基本的方法,它提供了基本的对象到 sproc 映射,但它不支持更复杂的 ORM 功能,如缓存、更改跟踪等。
EF6 将更全面地支持存储过程以支持查询、更新和删除,从而支持更多功能集。
EF 不是灵丹妙药。它需要权衡取舍,您需要决定在您要使用它的情况下它是否适合您。
仅供参考,在更新对象之前需要获取对象是绝对错误的,尽管这只是处理它的最简单方法。EF 还实现了一个工作单元模式,因此如果您进行 10 次插入,它不会进行 10 次往返,它会将它们全部作为单个准备好的语句发送。
就像你可以编写糟糕的 SQL 一样,你也可以编写糟糕的 EF 查询。仅仅因为你擅长 SQL 而不擅长 EF 并不意味着 EF 很烂。这意味着,你还不是这方面的专家。
所以对于你的问题,不。从来没有人说过使用 Sprocs 是一个坏主意。问题是,在许多情况下,存储过程是多余的。它们还将您的逻辑人为地分离为两个不同的子系统。用 C# 编写查询意味着您完全用一种语言编写业务逻辑,这对维护有很多好处。有些环境需要使用 sproc,有些则不需要。