12

如果开始一个新项目,你会为你的 ORM NHibernate 或 LINQ 使用什么以及为什么。各有什么优缺点。

编辑:LINQ to SQL 不仅仅是 LINQ(感谢@Jon Limjap)

4

6 回答 6

13

我问过自己一个非常相似的问题,除了我考虑的不是 NHibernate,而是我认为非常好的 WilsonORM。

在我看来,有许多重要的区别。

林克:

  • 不是一个完整的 ORM 工具(你可以使用一些额外的库,比如最新的 Entity 框架——我个人认为,与其他 ORM 框架相比,MS 的这项最新技术的架构大约有 10 年的历史)
  • 主要查询支持智能感知的“语言”(编译器将检查查询的语法)
  • 主要用于 Microsoft SQL Server
  • 是闭源的

休眠:

  • 是ORM工具
  • 没有智能感知的查询语言非常有限
  • 几乎可以与您拥有 DB 提供程序的任何 DBMS 一起使用
  • 是开源的

这真的取决于。如果您开发一个 Rich (Windows) 桌面应用程序,您需要在其中构造对象、使用它们并最终保留它们的更改,那么我会推荐像 NHibernate 这样的 ORM 框架。

如果您开发的 Web 应用程序通常只查询数据,并且只是偶尔将一些数据写回数据库,那么我会推荐像 Linq 这样好的查询语言。

所以一如既往,这取决于。:-)

于 2008-09-10T04:45:41.680 回答
10

错误... NHibernate 有 LINQ

也许您的意思是使用哪个:

  • LINQ 到 SQL
  • 休眠

我更喜欢NHibernate。

LINQ to SQL 相当轻量级,但它与您的数据结构的耦合更紧密一些,而 NHibernate 在可以映射到表结构的对象定义类型方面非常灵活。

当然,这并不是说 LINQ to SQL 没有用处:这个网站使用它。我相信在数据库模式不是那么庞大的小型应用程序中启动和运行非常有用。

于 2008-09-10T04:41:36.290 回答
3

从 NHibernate 开始是一个坏主意。它只有通过巧妙的设置才能显示出良好的性能。尝试将 EFv4 用于大型项目,将 L2S(可能是第 3 部分产品)用于中小型项目。这些产品比 NHibernate 更方便灵活,让您快速上手。

于 2010-12-02T16:21:50.643 回答
2

不是完整的清单

LinqToSQL Pro:

  • 更好的工具支持
  • 好的 linq 提供商
  • 当 db-schema == classes 时很容易开始 -

缺点:

  • 不灵活(即 db-schema != 类)
  • 仅支持 MS SQL Server
  • 没有级联(保存,更新......不级联到引用的对象)

NHibernate Pro:

  • 很多 rdbms 支持 ootb
  • 功能丰富
  • 对于几乎所有角落情况都非常灵活
  • 开源

缺点:

  • 不太容易开始
  • 不是来自 MS
  • 有很多工具,但你必须搜索

在 2 个 ORM 之间

如果出现以下情况,我会选择 LinqToSql:

  • db-schema == 类
  • 只使用 MS SQL Server
  • 商店只允许 MS-Products

如果出现以下情况,我会选择 Nhibernate:

  • 更丰富的对象模型
  • 遗留数据库模式
  • MS SQL Server 以外的数据库或支持多个
  • 性能至关重要(我认为 NH 比 LinqToSql 具有更多优化性能的功能)

注意:这是我个人的看法。我主要处理(疯狂的)遗留数据库和复杂的 ETL 作业,其中对象模型对 SQL 有很大帮助。

于 2011-05-25T09:43:17.410 回答
0

我不使用(甚至不知道)NHibernate,我只想作证:我使用 LINQ to SQL 大约 2 年以来使用 MySQL 和 PostgreSQL 数据库(在 Windows 上使用DbLinq ,在 Linux 和 Mac OS X 上使用 Mono)

因此 LINQ to SQL 不仅限于 Microsoft 产品。

我可以确认 LINQ to SQL 非常适合中小型项目,或者您可以完全控制数据库结构的大型项目。正如评论所表明的那样,LINQ to SQL 有一些限制,当数据库表和实体类之间没有直接映射时,使其成为不合适的工具。

注意:LINQ to SQL 不支持多对多关系(但这可以通过几行代码轻松实现)。

于 2011-12-06T22:24:58.423 回答
0

The main drawback of NHibernate is the inability to make use of method calls. They cannot be translated to SQL. To circumvent that, you have to recreate expression trees which is difficult to do.

于 2012-06-27T14:58:12.223 回答