NHibernate或LINQ to SQL

如果开始一个新项目,你将使用什么ORM NHibernate或LINQ以及为什么。 每种方法的优缺点是什么?

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

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

在我看来,有许多重要的差异。

LINQ:

  • 不是一个完整的ORM工具(你可以通过一些额外的库来实现,比如最新的entity framework – 我个人认为MS的这种最新技术的架构与其他ORM框架相比大约有10年的历史)
  • 主要是查询“语言”支持intellisense(编译器会检查你的查询的语法)
  • 主要用于Microsoft SQL Server
  • 是封闭源

NHibernate的:

  • 是ORM工具
  • 没有intellisense的查询语言非常有限
  • 几乎可以与您拥有数据库提供程序的任何DBMS一起使用
  • 是开源的

这真的取决于。 如果你开发一个Rich(Windows)桌面应用程序,你需要构建对象,使用它们并最终坚持他们的更改,那么我会推荐像NHibernate这样的ORM框架。

如果您开发的Web应用程序通常只是查询数据而只偶尔将一些数据写回数据库,那么我建议使用像Linq这样的良好查询语言。

一如既往,这取决于。 🙂

呃…有NHIDnate的LINQ 。

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

  • LINQ to SQL
  • NHibernate的

我更喜欢NHibernate。

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

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

从NHibernate开始是个坏主意。 只有熟练的设置才能表现出良好的性能。 尝试将EFv4用于大型项目,并将L2S(可能是第3部分产品)用于中小型。 这些产品比NHibernate更方便灵活,让您快速入门。

不是一个完整的清单

LinqToSQL Pro:

  • 更好的工具支持
  • 好的linq提供商
  • db-schema == classes时很容易入手 –

缺点:

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

NHibernate Pro:

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

缺点:

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

在2个ORM之间

我会选择LinqToSql如果:

  • db-schema == classes
  • 只使用MS SQL Server
  • 商店只允许MS产品

我会选择Nhibernate如果:

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

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

我不使用(甚至不知道)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不支持多对多关系(但这可以通过几个代码行轻松实现)。

NHibernate的主要缺点是无法使用方法调用 。 它们无法转换为SQL。 为了避免这种情况,你必须重新创建难以做到的表达式树。