其他开发人员看到我的代码时眼睛会变得很大,并鼓励我学习我不喜欢的LINQ。
现在我正在开始一个ASP.NET MVC项目,现在感觉应该摆脱恐龙时代,移动到实体框架中处理我的数据。
我知道SqlCommand类是Entity Framework背后的核心部件,所以我认为为什么要通过中间人(实体)来实现相同的结果并花费时间学习新东西呢?
请问有人能够解释一下为什么我需要转型,或者我应该坚持我所知道的吗?
转换到EF的主要原因是:
我多年前就转换(通过Linq2SQL),从未回头。
选择EF代码优先并使用迁移。
使用SqlCommand,如果你做得对的话,要么已经写了ORM的相等版本,要么你正在花费大量时间编写代码来打包参数,并将列映射到对象。如果你两者都没有做,那么很可能你有不安全的代码并且传递未类型化的数据集,然后进行大量转换,或者你正在执行危险的串联SQL查询,容易受到SQL注入攻击。
使用EF(或任何ORM)的好处在于它处理SQL生成、对象映射、参数打包,并提供一个非常强大的查询界面,让你可以快速编写多个查询。
为什么要写10行代码?当你可以只写一行时呢?
是否使用EF实际上纯粹是个人选择...但是如果你正在进行严肃的面向对象开发,你应该使用某种ORM(甚至像Dapper或Massive这样的微型ORM)。或者自己编写微型ORM。
在没有某种自动映射技术的情况下,使用ADO只会带来巨大的痛苦。
我猜我在这个观点上会孤立无援,但是我还是要说一下。
我自己也思考过这个问题。我也是一个SqlCommand
和ADO的人,而且我预计我至少还会再用一段时间。
这让我想起了LinkedIn上的一次讨论,你可能想看看这里。我相信有很多网站都在谈论这些优势,但那个帖子有几个开发者讨论了他们对此的看法。
这就是我的看法:
基本上,我并不认为有太多的理由去转换。我认为这不会使代码难以阅读(事实上,我喜欢冗长的选项)。通过编写自己的语句,我可以确保我的操作是正确的,并且我可以将代码直接复制到SSMS中,完全知道它在两个位置上都会执行相同的操作。我倾向于编写自己的数据库访问代码,所以我走的是ADO.NET路线。我想有些人可能会称我为纯粹主义者(并不是什么好事),但我只是喜欢它给我的灵活性。我拥有完全的控制权,我知道什么会或不会工作,这可以节省查看文档的时间。实际上,我使用了一些我自己编写的包装器来做类似于Entity Framework的事情,但同时也给了我更多的控制权。不过,它仍然是建立在ADO之上的,所以我总是可以随时进去改变任何我想要的东西。
string.Format
和params
方式输入参数的包装器),另一个级别则是建立在此之上的,可以使用半强类型代码直接构建不同类型的语句,最高级别的基于一系列属性和提示的级别则最像EntityFramework。SELECT
并不需要我花费太多的时间,因此使用其他方法也不会节省多少时间。 SqlCommand 不会很快消失。因此,我没有找到任何理由离开完全控制的舒适区域。
编辑:
阅读了其他几个回答后,我想我有些话要补充。我认为您已经编写了类似于我所拥有的ORM,但是如果您为每个调用编写完整的 SqlCommand 文本并即时转换所有内容,那么这很可能会导致问题。所以我一定要远离它。我倾向于喜欢拥有自己的ORM来做我想做的事情(我想一个很好的例子是,例如,如果应用程序需要,我将自动解析 XElement ,或者我将更改Sql空间数据为更易管理的内容),但是如果您的选择在于EF和不断编写与进行ADO调用相关的每一行代码之间,那么您应该切换到EF。那会带来比好处更多的危害。
编辑2:
我认为另一个需要记住的重要事情是,如果你编写自己的ORM,你需要将数据库结构与对象模型相结合。EF会保持一切同步,这很方便,但我仍然喜欢对一切有更多的控制权,而且我不介意亲自完成这项工作。
ExecuteNonQuery("SELECT * FROM tablename WHERE username = @p0", tbUsername.Text);
。这显然是一个完全虚构的例子,但它展示了语法。基本上,我会为传入的每个对象添加参数,并使用“@p{index}”的命名约定。这使得参数化非常容易。正如我简要提到的,它与string.Format
并没有太大区别,尽管使用自己的分隔符使它们更兼容。 - Matthew Haugen