在以下方面,你如何评价它们:
性能
发展速度
整洁、直观、可维护的代码
灵活性
整体
我喜欢我的SQL,所以一直是ADO的铁杆粉丝。NET和存储过程,但我最近玩了一个Linq to SQL,并被我写出我的DataAccess层的速度所震惊,并决定花一些时间真正理解Linq to SQL或EF…或不?
我只是想确认一下,这些技术中没有什么重大缺陷会让我的研究变得毫无用处。例如,性能很糟糕,对于简单的应用程序来说很酷,但只能到此为止。
更新:
你能专注于EF VS L2S VS SPs而不是ORM VS SPs吗?我主要对EF VS L2S感兴趣。但是我也热衷于将它们与存储的procs进行比较,因为纯SQl是我非常了解的东西。
首先,如果你正在开始一个新项目,使用实体框架(“EF”)-它现在生成更好的SQL(更像Linq to SQL),比Linq to SQL(“L2S”)更容易维护和更强大。在。net 4.0发布时,我认为Linq to SQL是一种过时的技术。MS对于不再继续L2S的开发持非常开放的态度。
1)性能
这个问题很难回答。对于大多数单实体操作(CRUD),您会发现这三种技术的性能几乎相当。你必须知道EF和Linq to SQL是如何工作的,以便充分使用它们。对于轮询查询这样的大容量操作,您可能希望让EF/L2S“编译”您的实体查询,这样框架就不必不断地重新生成SQL,否则您可能会遇到可伸缩性问题。(参见编辑)
对于要更新大量数据的批量更新,原始SQL或存储过程总是比ORM解决方案执行得更好,因为您不必通过连接将数据编组到ORM来执行更新。
(2)发展速度
In most scenarios, EF will blow away naked SQL/stored procs when it comes to speed of development. The EF designer can update your model from your database as it changes (upon request), so you don't run into synchronization issues between your object code and your database code. The only time I would not consider using an ORM is when you're doing a reporting/dashboard type application where you aren't doing any updating, or when you're creating an application just to do raw data maintenance operations on a database.
3)整洁/可维护的代码
EF击败了SQL/sprocs。因为对关系进行了建模,所以代码中的连接相对较少。对于大多数查询,实体之间的关系对读者来说几乎是不言而喻的。没有什么比不得不从一层调试到另一层或通过多个SQL/中间层来了解数据实际发生了什么更糟糕的了。EF以一种非常强大的方式将数据模型引入到代码中。
4)灵活性
存储的proc和原始SQL更“灵活”。您可以利用spprocs和SQL为特定情况生成更快的查询,并且您可以比使用和ORM更容易地利用本机DB功能。
5)整体
Don't get caught up in the false dichotomy of choosing an ORM vs using stored procedures. You can use both in the same application, and you probably should. Big bulk operations should go in stored procedures or SQL (which can actually be called by the EF), and EF should be used for your CRUD operations and most of your middle-tier's needs. Perhaps you'd choose to use SQL for writing your reports. I guess the moral of the story is the same as it's always been. Use the right tool for the job. But the skinny of it is, EF is very good nowadays (as of .NET 4.0). Spend some real time reading and understanding it in depth and you can create some amazing, high-performance apps with ease.
编辑:EF 5使用自动编译的LINQ查询简化了这一部分,但对于真正的高容量的东西,你肯定需要测试和分析在现实世界中最适合你的东西。
存储过程:
(+)
极大的灵活性
完全控制SQL
最高的可用性能
(-)
需要SQL知识
存储过程不在源代码控制范围内
在指定相同的表和字段名时,大量的“重复自己”。在重命名一个DB实体并丢失对它的某些引用后,很可能会破坏应用程序。
缓慢的发展
ORM:
(+)
快速发展
数据访问代码现在在源代码控制下
您与DB中的更改隔离开来。如果发生这种情况,您只需要在一个地方更新您的模型/映射。
(-)
业绩可能会更差
没有或很少控制ORM生成的SQL(可能效率很低或bug更多)。可能需要进行干预并将其替换为自定义存储过程。这将使你的代码变得混乱(一些LINQ在代码中,一些SQL在代码中和/或在源代码控制之外的DB中)。
因为任何抽象都可能产生“高级”开发人员,他们根本不知道它是如何工作的
一般的权衡是在拥有很大的灵活性和损失大量时间与受到限制,但可以很快完成之间进行。
这个问题没有统一的答案。这是神圣的战争。这也取决于手头的项目和你的需求。选择最适合你的。