关于c#:NHibernate或LINQ to SQL

关于c#:NHibernate或LINQ to SQL

NHibernate or LINQ to SQL

如果开始一个新项目,您将对ORM NHibernate或LINQ使用什么以及为什么使用它。 各自的优缺点是什么。

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


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

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

LINQ:

  • 并不是一个完整的ORM工具(可以通过一些其他库(例如最新的Entity Framework)到达那里-与其他ORM框架相比,我个人认为MS的这项最新技术的体系结构已有大约10年的历史了)
  • 主要查询支持智能感知的"语言"(编译器将检查您查询的语法)
  • 主要用于Microsoft SQL Server
  • 是封闭源

NHibernate的:

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

真的要看如果您开发一个Rich(Windows)桌面应用程序,需要在其中构造对象,使用它们并最后保留它们的更改,那么我建议您使用NHibernate之类的ORM框架。

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

因此,一如既往,这取决于。 :-)


嗯...有NHibernate的LINQ。

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

  • LINQ转SQL
  • NHibernate的

我更喜欢NHibernate。

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

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


从NHibernate开始是个坏主意。仅通过适当的设置才能显示出良好的性能。尝试将EFv4用于大型项目,将L2S(也许是第三部分产品)用于中小型项目。这些产品比NHibernate更方便,更灵活,可让您快速入门。


清单不完整

LinqToSQL
优点:

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

缺点:

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

NHibernate的
优点:

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

缺点:

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

在两个ORM之间

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

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

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

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

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


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


我不使用(甚至不知道)NHibernate,我只是想证明一下:我使用LINQ to SQL大约两年了,用于MySQL和PostgreSQL数据库(在Windows上使用DbLinq,在Linux和Mac OS X上使用Mono)。

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

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

注意:LINQ to SQL不支持多对多关系(但是,只需几行代码即可轻松实现)。


推荐阅读