我有点害怕问这个问题,因为它可能会开始一场宗教战争,所以我想要清楚地知道我在寻找什么.我正在寻找一个理由,为什么你会或者已经或者已经跳过了某种方式以及将项目添加到我的列表中.我正在寻找大票,大爆炸物品.此外,产品特定的项目,如果它们真的相关,也许.此时我正在尝试评估ORM与手动而不是产品A与产品B.
ORM优势
- Quick to code and low maintenance (in some/most scenarios) - Additional features for "free" (no developer effort)
手工编码优势
- More Efficient (at runtime, maybe not at dev time?) - Less layers of complexity - Most ORMS seem to struggle with being retricted to sprocs only
为了充分披露,我真的不喜欢"某事"对我的数据库执行代码的想法,我无法直接修改,如果我认为合适,但我可以看到ORM的潜在大量开发时间优势.
它也许值得注意我在.Net世界
[编辑](使用ORM或普通SQL的问题?似乎回答了许多问题并强调了关于性能的观点)
所以,稍微改变我的问题
有没有在早期阶段使用ORM构建应用程序,然后逐渐用手动编码的DAL替换?这种方法的缺陷是什么?
[进一步编辑 - 现在解决问题的核心]让一个网站能够对我的数据库执行任何SQL是可怕的.如果通过sprocs进行所有访问,我的数据库将保持良好,安全,舒适的隔离.使用专门的sprocs删除了很多(如果不是全部)SQL注入攻击向量.对此有何评论?
我们最初使用JPA编写了一个应用程序,因为它自生产之日起我们就后悔了.ORM进行的数据库调用量是天文数字,因此我们现在开始使用Spring的JDBC帮助程序类使用优秀的JDBC来重写应用程序.从ORM开始的缺陷是我们花了大量时间学习JPA,并且在一天结束时我们必须用JDBC替换它,这样我们的应用程序可以更加可扩展,而无需向Oracle RAC添加其他3个节点.因此,如果你平衡它,JDBC的控制和精度值得你必须编写额外的代码行.此外,大多数人不理解SQL不是可以生成和期望执行的东西.
我已经将Subsonic用于了几个大型项目.我不是在提倡使用一个ORM而不是另一个,但我不会做一个与数据库相关的项目.每当我更改数据库结构时,都能够重新生成整个数据库访问层,能够在一个地方添加影响整个数据库层的功能.
问题是您必须了解它与数据库的交互方式,否则您将面临编写(严重)代码不足的风险.您的ORM工具可能会为您提供一个很好的面向对象的数据视图,但您可能会发现您正在将整个表格流式传输到客户端以进行简单的处理.数据库擅长关联和过滤数据,因此请确保它仍然具有该作业.具有讽刺意味的是,Subsonic缺少连接(在我使用的版本中),这有助于此,因为它迫使我创建数据库视图以在需要时组合数据.
我的一个朋友和一个开发了内部ORM工具的人一起工作.它有一个很好的功能,可以通过遍历外键来本地缓存您可能想要从数据库中获取的所有内容.缺点是从DB中的一行读取一列导致超过11,000个选择语句.
我已经编写和维护自己的ORM已有8年了.它始于Java,然后转换为C#.没有它,我无法想象编写任何数据库支持的系统.它比NHibernate更简单,并且没有它的所有功能,但它完成了工作,即使它广泛使用反射也很快,因为它用DAO类定义的反射替换了XML配置.
我对它很满意,不会使用任何其他方法.
编辑:关于SQL注入攻击:我使用这个ORM开发的最新系统经过了广泛的审核,绝对不允许注入.原因很简单:它动态生成SQL并始终使用参数,没有字符串连接.
几个星期前,我开始开发一个新项目.我完全控制了我可以使用的工具.我从db40开始,因为我想完全消除这个问题; 我只想直接保留我的对象,忘记ADO.NET或OR/M. 但db40有问题,所以我要放弃它.
我的下一个选择是ADO.NET,因为我认为它会快速而简单.但是我不得不写太多的代码,使用太多的"字符串sql",这只是一件苦差事.我的意思是,这是一个皇家PITA,在编写了两个存储库之后,我想切割我的手腕.
我的第三个选择是NHibernate.在我需要使用断开连接的对象的情况下,我之前遇到过NHibernate的问题(这次也是这种情况,因此为什么我花了三次尝试才得到它).但那是NHibernate 1.2.这次我获得了2.0二进制文件,并且没有更新断开连接的对象的问题.我还必须编写更少的代码行,当我需要重构事物时它非常简单,这可能是最重要的,因为我的设计变化很快.
我现在在NHibernate上卖了.它似乎也高度优化.老实说,我找不到它的负面影响.并且没有存储过程.
我知道这是我的OR/M选择,我永远不会直接写ADO.NET.