使用存储过程这么糟糕吗?

时间:2013-06-07 06:24:49

标签: c# entity-framework

Microsoft经常提供一些方法来简化开发简单易事的工作。

在EFxx中有一些我不喜欢的东西。 首先,为了进行更新,您需要首先加载记录,因此操作变为两步过程,您可能只想更新一个布尔值。

其次,我喜欢存储过程,因为我可以在同一个连接调用中运行10个不同的东西,如果我使用EFxx,我将不得不运行10个单独的数据库调用(如果涉及更新,则需要更多)。

我对MVC EF专家的关注和疑问是...... 使用存储过程这么糟糕吗?我仍然认为EFxx只是微软让我们更快地开发简单程序的另一种方式,但实际上它并不是真正推荐的方式。

任何暗示和提示都会受到高度赞赏,尤其是“在EFxx上运行更新的最佳方式”的概念。 “存储过程对EFxx不利”。

2 个答案:

答案 0 :(得分:8)

你陷入了逻辑谬误。仅仅因为EF被设计为以某种方式工作并不意味着你不应该以不同的方式做到这一点。而且仅仅因为EF可能不会以某种方式做某件事并不意味着EF糟透了或者不应该用于任何事情。这是全有或全无的论点。如果它不能完美地完成所有事情,那么它就没用了......而这是不正确的。

EF是一种对象关系映射工具。您只能在将数据用作对象时使用它。如果要将数据用作关系集(也称为SQL),则不会使用它。

你也没有停止使用EF或什么都没有。您可以使用EF进行查询,并使用存储过程进行更新。或者相反。这是关于使用最适合给定情况的工具。

不,EF不只是为了“简单”或“琐碎”的事情。但是,将其用于更复杂的场景通常需要更深入地了解EF的工作原理,以便您了解其在幕后的作用。

在EF中使用存储过程就像说MyContext.Database.ExecuteSqlCommand()MyContext.Database.SqlQuery()一样简单。这是最基本的方法,它为sproc映射提供了基本的对象,但它不支持更复杂的ORM功能,如缓存,更改跟踪等。

EF6将更全面地支持sprocs以支持查询,更新和删除,支持更多功能集。

EF不是一个神奇的子弹。它有权衡,你需要在你将要使用它的情况下决定它是否适合你。

仅供参考,在更新之前需要获取对象是绝对错误的,尽管这只是处理它的最简单方法。 EF还实现了一个工作单元模式,所以如果你要进行10次插入,它不会进行10次往返,它会将它们全部作为单个预备语句发送。

就像您可以编写错误的SQL一样,您可以编写错误的EF查询。仅仅因为你擅长SQL而且EF不好并不意味着EF很糟糕。这意味着,你还不是它的专家。

所以对你的问题,不。没有人说使用Sprocs是一个坏主意。事实是,在许多情况下,sprocs是矫枉过正。它们还将您的逻辑人工分离为两个不同的子系统。用C#编写查询意味着您完全用一种语言编写业务逻辑,这对许多维护有益。有些环境需要使用,有些环境不需要..

答案 1 :(得分:5)

这已被多次询问和回答。像this one.

一样

两者总会有利有弊。这只是对你来说重要的事情。你只需要简单的CRUD操作(一次一个)吗?我可能会使用ORM。你做批量数据库操作吗?使用SP。你需要快速发展吗?使用ORM。您是否需要灵活性以便您需要完全控制SQL?使用SP。

另外,请注意,您可以减少EF中的上下文数据库跳数。您可以尝试详细了解不同的types of EF loading。此外,在EF中可以调用SP。 Data read using SP& Add/Update using SP