Asp.net 存储过程与脚手架

Asp.net 存储过程与脚手架,asp.net,asp.net-mvc,entity-framework,stored-procedures,Asp.net,Asp.net Mvc,Entity Framework,Stored Procedures,我正在使用ASP.NETCore1.0,网站将会很大(预计每小时5000名访问者)。我曾多次读到存储过程非常快速和安全(在SQL注入等方面)。但是代码第一个EF是如此简单以至于我想使用它,但是CRUD方法是隐藏的 在性能和安全性方面,使用EF而不是SP的脚手架有什么缺点(如果有的话)?只要您使用参数化SQL,您在SQL注入方面应该是可以的。切勿使用用户输入通过字符串连接直接“构建”SQL查询。所以,只要正确使用实体框架、存储过程或其他工具,就不必担心SQL注入 就性能而言,实体框架和其他类似工具

我正在使用ASP.NETCore1.0,网站将会很大(预计每小时5000名访问者)。我曾多次读到存储过程非常快速和安全(在SQL注入等方面)。但是代码第一个EF是如此简单以至于我想使用它,但是CRUD方法是隐藏的


在性能和安全性方面,使用EF而不是SP的脚手架有什么缺点(如果有的话)?

只要您使用参数化SQL,您在SQL注入方面应该是可以的。切勿使用用户输入通过字符串连接直接“构建”SQL查询。所以,只要正确使用实体框架、存储过程或其他工具,就不必担心SQL注入

就性能而言,实体框架和其他类似工具的总体性能较差。我不确定这一点是否足以阻止您使用它,除非您的程序预计会有非常大的使用量

StackExchange有一个很好的开源工具,它比实体更轻量级,但仍然有一些很好的特性。它允许您编写原始SQL。请参阅中有关性能的部分。它的性能非常好,比其他框架要好得多

远离存储过程有助于改进您的体系结构。存储过程可能会鼓励您在数据库中对大量业务逻辑进行编码,而单元和集成测试更难进行。此外,由于必须保持应用程序、存储过程和模式同步,部署新应用程序变得更加困难

因此,简而言之,实体框架是一个很好的工具,但会降低性能。还有一些替代存储过程的方法仍然是高性能的。无论您使用什么成熟的工具(正确地),安全性都不应该是一个问题

编辑以回答其他问题

Dapper不容易受到SQL注入的影响吗?

当然可以,但如果使用不当,几乎任何工具都会损坏。下面是使用他们文档中简洁示例的正确方法。此查询已参数化

connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)",
    new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } }
  )
下面是一个容易受到SQL注入影响的坏例子:

connection.Execute(@"insert MyTable(colA, colB) values ('" + a + "', '" + b + "')")
实体框架总是安全的吗?

不,如果您像上一节那样连接变量并使用,您也会遇到问题

存储过程总是安全的吗?

不,如果使用不带参数化的动态SQL,仍然会遇到SQL注入问题

下面的链接讨论了ORM和存储过程如何容易受到SQL注入的影响:

在性能和安全性方面,与SP相比,使用EF脚手架的缺点(如果有)是什么?

如果像上面讨论的那样正确使用,则不会出现安全问题。脚手架是伟大的,如果你做积垢网页

如果您需要执行高级报告,您可能需要自定义SQL,这仍然可以通过EntityFramework完成。在你的应用程序中尽可能多地使用脚手架并没有什么错,因为使用脚手架是有意义的,然后通过实体使用参数化SQL来完成其他一切。您甚至可以始终使用脚手架,然后修改生成的类来执行您想要的操作。对于CRUD页面,使用脚手架;对于高级查询,编写自己的


在简单查询中使用实体框架对性能的影响可能不会对基本查询造成影响-应该是最小的。您需要更多地担心正确的索引和数据库模式。错误的模式或不正确的索引将导致性能问题。

我认为在EF中编写存储过程和编写查询之间的选择与在汇编程序中编程和编写在托管环境(如.NET和Java)中运行的程序之间的区别类似(在某种程度上)。为托管环境编写的应用程序总是比用汇编语言编写的应用程序慢,但另一方面,使用托管语言编写复杂的应用程序通常要容易得多(因此也更便宜)。通过使用EF linq,您将更快地编写查询,并且查询通常比sql等价物更简单,因此更易于维护。另一个重要因素是,应用程序变化迅速,新的功能正在添加,旧的功能正在重写,同时,流程表和其他数据库结构也在发生变化。发生这种情况时,您的SP将无法再正常工作。你什么时候知道应该修复它们?只有当你运行它们的时候。什么时候知道需要修复EF查询,因为表发生了更改?在汇编期间。性能下降了吗?一般来说,现在我们有速度快、价格便宜的机器,所以我们不太在意。我检查了一次EF查询的执行时间和它的sql等价物—纯sql使我的执行时间减少了5%—这对我来说没什么。由于sql查询要复杂得多,所以很有可能以错误的方式编写查询,这样就不必要了。最后,如果您需要在应用程序中为某些复杂查询提供非常好的性能,请将其编写为SP并使用EF轻松执行


当涉及到安全性时,EF查询生成器总是使用sql参数,因此它们对sql注入和SP一样安全。

您可以使用脚手架创建数据库和视图,并用自己的方法替换对内置方法的调用。

这里还有另一个元素:可维护性。你支持这个产品吗?如果有一个关键问题需要快速解决,那么使用存储过程会更快还是更慢?对我来说,是的。对于其他人,No.@Nick.McDermaid对于我来说,目前唯一的问题是安全性和性能。我无法决定是否使用EF。我可以决定代码优先还是数据优先。那么,在这个场景中,您会推荐哪一个呢?@RobertHarris在下面给出了很好的观点。自动生成的EF SQL代码可能会导致性能问题,在这种情况下,您无法手动优化SQL,因为