Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我有LINQ到SQL时,为什么需要存储过程_C#_.net_Linq_Linq To Sql_Stored Procedures - Fatal编程技术网

C# 当我有LINQ到SQL时,为什么需要存储过程

C# 当我有LINQ到SQL时,为什么需要存储过程,c#,.net,linq,linq-to-sql,stored-procedures,C#,.net,Linq,Linq To Sql,Stored Procedures,我对Linq to Sql的理解是,它将接受我的Linq语句并将其转换为等效的Sql语句 所以 变成 Select * from Products where CategoryName = 'Beverages' 如果是这样的话,我就看不出存储过程还有什么用处了。如果在适当的情况下使用存储过程,SQL Server方面会有显著的相关性能改进。存储过程是另一个现成的工具。90%的任务你都可以使用你的自动调节扳手,但你不能在剥开的螺母上使用闪亮的东西。因此,一个好的老扳手是你最好的朋友。除非你把螺

我对Linq to Sql的理解是,它将接受我的Linq语句并将其转换为等效的Sql语句

所以

变成

Select * from Products where CategoryName = 'Beverages'

如果是这样的话,我就看不出存储过程还有什么用处了。

如果在适当的情况下使用存储过程,SQL Server方面会有显著的相关性能改进。

存储过程是另一个现成的工具。90%的任务你都可以使用你的自动调节扳手,但你不能在剥开的螺母上使用闪亮的东西。因此,一个好的老扳手是你最好的朋友。除非你把螺栓弄断了,否则你就要被装配卡住了。

安全

我看到了一些“安全最佳实践”指导原则,建议您通过SP进行所有数据访问,并且您只授予执行这些SP的权限。
如果客户端无法对任何数据库表执行
select
delete
,则该客户端被黑客攻击的风险可能会更低

我从来没有亲自参与过这样的项目,它总是让我感到非常痛苦

  • 存储过程和Linq到Sql解决了不同的问题

  • Linq to Sql是Microsoft Sql Server特有的


  • 包括对LINQ to SQL的存储过程支持,部分是为了与现有系统兼容。这使得开发人员能够随着时间的推移,一个存储过程一个存储过程地从基于存储过程的系统迁移到完全基于LINQ的系统,而不是强迫开发人员一下子转换整个系统。

    就我个人而言,我不关心LINQ。我喜欢将数据操作和代码分离。此外,从LINQ语句生成的匿名类型不能传递到n层应用程序的其他层,因此需要具体定义该类型,或者需要在UI中进行LINQ调用。嘎

    此外,还存在安全问题(LINQ代码在MS SQL Server中调用的任何用户都需要不受限制地访问数据,因此,如果用户名/密码被泄露,数据也会被泄露)

    最后,LINQ to SQL仅适用于MS SQL Server(因为它来自MS)。

    简单示例:

    select * from Products where GetCategoryType(CategoryName)=1
    
    GetCategoryType可以运行得非常快,因为它在DB服务器上运行。
    据我所知,没有任何Linq-to-SQL可以替代它。

    很多人已经有一段时间没有Linq-to-SQL了。如果你能在没有它们的情况下安全高效地完成工作,那么不要因为使用纯L2而感到内疚。我们很高兴在“我的商店”中摆脱了它们。

    如果这就是您在sql中所做的一切,那么您以前不需要存储过程

    啊,这是许多辩论的主题

    如今,许多人会争辩说,像LINQtoSQL这样的技术现在生成了如此好的SQL,以至于性能优势微乎其微。就个人而言,我更喜欢SQL专家调整SQL性能,而不是一般的程序员,所以我倾向于不同意

    然而,我对存储过程的主要偏好与性能关系不大,而与安全性和配置管理关系更大

    我的大部分体系结构工作都是关于面向服务的解决方案,通过将数据库视为一种服务,存储过程的使用大大有助于解决这一问题


    原则上,通过存储过程限制对数据库的访问会创建一个定义良好的接口,从而限制攻击范围并提高可测试性。允许应用程序直接访问底层数据大大增加了攻击面,降低了安全性,并使影响分析变得极其困难。

    存储过程也有其用途,就像使用LINQ一样。在我看来,如果一个操作在多个地方执行多次,那么它很适合“重构”到存储过程中,而不是在不同地方重复的LINQ语句


    而且,这对这里的很多人来说可能是亵渎神明,有时候你应该在数据库中加入一些逻辑,然后一个大爆发就派上了用场。这种情况很少发生,但有时业务规则的性质需要它。

    存储过程在许多情况下都很有用,但一般来说,如果您使用的是ORM,您应该让ORM为您生成SQL。为什么我们必须为每个表维护至少四个存储过程(insert update delete和一个select)

    正如人们指出的那样,使用存储过程有安全好处。您不必授予用户对表的读/写权限,这是一种很好的防止SQL注入的保护

    当用于检索数据的逻辑相当复杂时,存储过程也很有用。您通常会在报告场景中看到这一点,在这种情况下,您可能不会使用Linq2Sql或其他ORM

    在我看来,如果您不生成SQL,而是在应用层中对其进行硬编码,那么应该将其重构为存储过程,是的,任何规则都会有例外,但一般来说是这样的


    Linq2Sql中存储过程的一种用途可能是,如果您有多台服务器,并且正在链接到它们,那么可以使用存储过程公开来自另一台服务器的数据并对其进行操作。这将对应用程序隐藏多个服务器。

    如果没有存储过程,有些事情是无法完成的。例如,在我以前的工作中,有一个存储过程从一行返回当前值,并在同一个原子操作中递增该值,以便没有两个进程都获得相同的值。我不记得为什么这样做而不是使用自动增量,但这是有原因的。

    您当然不“需要”存储过程。但是,如果您的域模型需要一个复杂的聚合实体,并且您没有足够的特权/灵活性来修改您的数据库,那么它们就可以派上用场
    select * from Products where GetCategoryType(CategoryName)=1