ORM有什么优点?

8
所以我现在遇到了一个难题,希望有人能够来帮助我,要么是拆除这堵墙,要么是阻止我的头继续碰壁!!
在过去的3-4周里,我一直在为一个新项目准备研究ORM。ORM必须映射到一个现有的、庞大的且陈旧的SQL数据库。
所以我尝试了Subsonic。我非常喜欢v2和v3,经过改装后可以很好地与VB和SQL中的命名模式配合使用,运行良好。然而,它缺乏灵活性,即实体属性名称与列名称分开的问题让我抓狂了(对不起,Rob)。
我尝试了Entity Framework,但像其他人一样,我发现它在某些方面缺乏功能。
所以我咬紧牙关尝试了nHibernate,但是在花费了一周左右的时间将其配置到我喜欢的样子后(借助于Codesmith为我生成类/hbms),我对启动时间(构建配置对象)感到沮丧,尽管尝试了许多技巧来缩短这个时间。
我基本上想要构建一个DAL类,可以在应用程序和网站之间共享。我是在走弯路吗?对于一个有数百个表的遗留项目,我应该回到ado.net并使用DTO吗?啊!
抱歉我的问题有点啰嗦。我剩下的头发不多了,我希望能保住它!!
提前感谢您,Ed
PS. 我应该补充一下,我非常了解SQL,并且不怕动手写快速查询。如果有什么需要,我不需要被隐藏在SQL中。

2
你有什么样的应用程序,以至于nhibernate的启动时间成为了一个问题?在我看来,只有当您直接从桌面访问数据库时才会困扰您,对于中间层服务而言并非如此。 - Dmitry Ornatsky
1
你可以通过简单地问“如何加速NHibernate应用程序的启动时间?”来简化这个抱怨。 - Michael Maddox
Andre - 我想要从桌面应用程序中使用 NHibernate!作为一个类库的一部分,将被多个辅助应用程序引用。其中一些小应用程序只需要几秒钟就可以运行,传统的 ado.net 方法没有问题,但使用 NHibernate 很麻烦。 - CResults
Michael - 我已经尝试了两个建议 - 将所有映射放在一个hbm文件中和对hbm进行二进制序列化。这两种方法都有所改善,但仍然存在明显的延迟。 - CResults
4个回答

8

ORM使您能够:

  1. 将表行映射到对象,这些对象是面向对象编程的可操作部分。
  2. 自动浏览对象关系
  3. 轻松添加、编辑和删除表行
  4. 以更直观的方式查询数据库,因为您无需考虑连接(这取决于ORM和查询方法)
  5. 透明地处理L1和L2缓存。

如果您不使用ORM,所有上述工作都必须手动完成。

PS:我同意Dmitry关于NHibernate启动时间的看法(请参见问题评论)。此外,您尝试过Fluent NHibernate吗?Fluent NHibernate非常简单易用。当我第一次映射数据库时,我简直不敢相信自己的眼睛。它甚至比DevExpress XPO等专有ORM更容易。


1
+1 推荐使用 FluentNHibernate。目前正在一个项目中使用它,它真的是“令人印象深刻的易用”。 - bunn_online

2
ORM工具的最大优点是可以帮助你正确地分层应用程序。现在大多数项目都使用数据层连接数据库。你可以从ORM工具开始生成与数据库对象对应的类,然后使用这些方法定义接口。所有持久化代码都使用此接口的方法。这样业务逻辑层只与此更高层次的接口耦合,并且不需要了解数据库。事实上,甚至不应该依赖于ADO.NET或NHibernate。
ORM工具的另一个优点是将应用程序与数据库服务器分离。你可以更改数据库引擎并仍然使用相同的代码。此外,ORM隐藏了SQL的复杂性,还可以帮助你处理事务逻辑和连接池。
我认为,对于新项目来说,ORM工具是必需品。对于旧项目来说,则没有那么多好处,除非当然你有时间/资金从头开始。

+1 是为了强调解耦。这就是我强烈推荐 ORM 工具和利用仓储模式的原因。 - Paul Turner
3
ORM工具不能帮助解耦。通过ORM机制,展示逻辑仍然可以使用ADO.NET或SQL与数据库通信。LinqToSql希望成为您的业务层,并实际上使分离业务和数据逻辑变得棘手。在大多数情况下,ORM无法隐藏除基本的CRUD和按名称/ ID类型查询之外的任何SQL。ORM对于遗留项目可能有用,但并不总是适合新项目。 - Michael Maddox
ORM工具确实有助于解耦。正如我所写的,这不是你需要做的唯一事情,因为你仍然需要定义接口方法,这些方法将隐藏对ORM库的依赖关系。这些方法可以使用像“Customer”或“Order”这样的类,这些类是使用ORM工具创建的,并映射到数据库。 - kgiannakakis

1
根据我的经验,大多数ORM比SQL更加复杂,这就违背了使用它们的初衷。
我热衷于的一个解决方案是LINQ2SQL。它在存储过程或视图的基础上表现出色,是一个轻量级的层。使用起来非常简单,不会试图隐藏SQL。

我能理解复杂性的问题;大多数ORM工具都非常复杂,需要进行配置。我认为它们确实解决了一系列相当复杂的问题,以证明它们的复杂性是有价值的,并且使用它们所获得的价值超过了学习如何使用它们的代价。 - Paul Turner
Andomar:通常,ORM公开对象而不是SQL。 这就是整个重点所在。 如果您不是要将关系表映射到对象上,为什么要使用ORM? 也许ADO.NET更适合您的需求。 - Michael Maddox
Andomar:你看过 PLINQO 吗?我用它和 Codesmith 对同一个数据库进行了映射,结果出现的错误更少,执行时间也更快 - 开箱即用,没有启动延迟。 - CResults
但是它还带有一些漂亮的ORM附加功能,这些功能在普通的Linq2SQL中是没有的。 - CResults


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接