NHibernate 或 LINQ to SQL [关闭]

Posted

技术标签:

【中文标题】NHibernate 或 LINQ to SQL [关闭]【英文标题】:NHibernate or LINQ to SQL [closed] 【发布时间】:2010-09-08 09:07:15 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

LINQ:

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

NHibernate:

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

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

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

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

【讨论】:

“没有智能感知的查询语言非常有限”有点误导...... NHibernate 有 HQL 和 Criteria API。标准是常规的 .NET 代码,因此您确实拥有 IntelliSense。 HQL 没有智能感知。 “有限查询语言”:在hql或criteria中不能表达sql查询的情况很少。主要与 CTE 相关,LINQ-to-SQL 也不支持 (***.com/questions/584841) 最后,有一些简单的方法可以使 Criteria API 的类型更强,请参阅:nhforge.org/blogs/149.aspx、bugsquash.blogspot.com/2008/03/… 我实际上同意大卫关于查询语言的观点。虽然我不会将其称为“限制”本身,但我会说 experessiveness 和智能感知支持的融合与 LINQ 不匹配。条件查询仍然依赖于开箱即用的字符串。也就是说,您现在可以在许多场景(不是全部)中使用 NHibernate 进行 LINQ。 快进到 2011 年:NHibernate 现在除了 HQL 和 Criteria API 之外,还包括一个非常完整的 LINQ 提供程序和 QueryOver。所以“有限的智能感知”论点现在实际上已经过时了。【参考方案2】:

呃……有LINQ for NHibernate。

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

LINQ to SQL NHibernate

我更喜欢 NHibernate。

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

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

【讨论】:

好吧,这个网站也不是“中等规模”,它是一个相当大的 .com,所以显然 LINQ to SQL 适用于 .com 或电子商务 .com 类型的应用程序......我会假设。【参考方案3】:

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

【讨论】:

【参考方案4】:

不是一个完整的列表

LinqToSQL 亲:

更好的工具支持 优秀的 linq 提供者 当 db-schema == 类时很容易开始 -

缺点:

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

NHibernate 亲:

很多 rdbms 支持 ootb 功能丰富 非常灵活,几乎适用于所有角落案例 开源

缺点:

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

两个 ORM 之间

如果满足以下条件,我会选择 LinqToSql:

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

如果满足以下条件,我会选择 Nhibernate:

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

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

【讨论】:

【参考方案5】:

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

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

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

但是对于 LINQ-to-SQL 来说也是如此,不是吗?

以上是关于NHibernate 或 LINQ to SQL [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有利于启动; Linq to SQL 还是 Nhibernate?

Linq To NHibernate Plus sql 用户定义函数

LINQ to nHibernate - 将 SQL“NOT IN”表达式转换为 LINQ

linq to sql、Entity Framework 和 NHibernate 的性能如何?

Linq to Sql vs Nhibernate vs SubSonic vs 存储过程(帮助)

对于不支持子查询的 NHibernate-to-LINQ 是不是有任何解决方法?