当前位置:  开发笔记 > 数据库 > 正文

NHibernate vs LINQ to SQL

如何解决《NHibernatevsLINQtoSQL》经验,为你挑选了5个好方法。

作为一个没有在现实世界项目中使用这两种技术的人,我想知道是否有人知道这两者如何相互补充以及它们的功能重叠多少?



1> Kevin Pang..:

LINQ to SQL强制您使用每类表格模式.使用此模式的好处是它可以快速轻松地实现,并且只需很少的工作就可以根据现有的数据库结构运行域.对于简单的应用程序,这是完全可以接受的(并且通常甚至更可取),但对于更复杂的应用程序,开发人员通常建议使用域驱动的设计模式(这是NHibernate所促进的).

每类表格模式的问题在于您的数据库结构对您的域设计有直接影响.例如,假设您有一个带有以下列的Customers表来保存客户的主要地址信息:

街道地址

压缩

现在,假设您要为客户的邮寄地址添加列,以便将以下列添加到Customers表中:

MailingStreetAddress

MailingCity

MailingState

MailingZip

使用LINQ to SQL,域中的Customer对象现在将具有这八列中每一列的属性.但是,如果您遵循域驱动的设计模式,您可能已经创建了一个Address类,并且您的Customer类拥有两个Address属性,一个用于邮件地址,另一个用于其当前地址.

这是一个简单的例子,但它演示了每个类的表格模式如何导致一个有点臭的域.最后,这取决于你.同样,对于只需要基本CRUD(创建,读取,更新,删除)功能的简单应用程序,LINQ to SQL因其简单性而非常理想.但我个人喜欢使用NHibernate,因为它有助于更​​清洁的域.

编辑:@lomaxx - 是的,我使用的示例是简单的,可以进行优化,以便与LINQ to SQL一起使用.我想尽可能保持基本,以便将重点放在首位.关键在于,有几种情况下,让您的数据库结构确定您的域结构将是一个坏主意,或至少导致次优的OO设计.


您可以使用Linq To SQL对存储库的实现进行编码,这非常方便.
@CoffeeAddict当阻抗不匹配太多时,那就是当你的应用程序太复杂而无法使用LINQ to SQL时,imo.我的例子是臭的原因是因为使用LINQ to SQL将导致8个属性而不是2并且限制你执行诸如实现接收Address类的函数或者在Address类上实现例程的能力,你将能够如果您使用过NHibernate会怎么做?

2> Ian Ringrose..:

到目前为止已经错过了两点:

LINQ to SQL不适用于Oracle或除SqlServer之外的任何数据库. 然而,第三方确实为Oracle提供了更好的支持,例如devArt的dotConnect,DbLinq,Mindscape的LightSpeed和ALinq.(我对这些没有任何个人经验)

Linq to NHibernate允许你使用具有Nhiberate的Linq,因此它可能会删除不使用的原因.

另外,Nhibernate的新流畅界面似乎使配置Nhibernate的映射变得不那么痛苦.(消除Nhibernate的痛点之一)


更新

Linq to Nhiberate在现在处于alpha状态的 Nhiberate v3更好.看起来Nhiberate v3可能会在今年年底发货.

.net 4 的实体框架工作也开始看起来像一个真正的选择.


Linq到NHibernate还处于初期阶段.它不是一个完整的实现,并且可以说,根本没有为生产使用做好准备.

3> lomaxx..:

@Kevin:我认为你提出的例子的问题是你使用的是糟糕的数据库设计.我原以为你会创建一个客户表和一个地址表并对表进行规范化.如果你这样做,你肯定可以使用Linq To SQL来实现你建议的场景.Scott Guthrie有很多关于使用Linq To SQL的帖子,我强烈建议你查看.

我不认为你可以说Linq和NHibernate相互补充,因为这意味着它们可以一起使用,虽然这是可能的,但你最好选择一个并坚持下去.

NHibernate允许您以高度灵活的方式将数据库表映射到域对象.它还允许您使用HBL查询数据库.

Linq to SQL还允许您将域对象映射到数据库,但它使用Linq查询语法来查询数据库

这里的主要区别是编译器在编译时检查 Linq查询语法,以确保您的查询有效.

linq需要注意的一点是,它仅在.net 3.x中可用,并且仅在VS2008中受支持.NHibernate有2.0和3.x以及VS2005.

NHibernate需要注意的一点是,它不会生成域对象,也不会生成映射文件.您需要手动执行此操作.Linq可以
自动为您完成此操作.


如果您针对遗留数据库结构编写代码而无法更改,因为它支持其他应用程序,该怎么办?您是否希望域模型继承糟糕的数据库设计,或者您是否希望创建可以独立于数据库结构而变化的丰富域模型?

4> asgerhallas..:

Fluent NHibernate可以根据简单的约定生成映射文件.没有XML编写和强类型.

我最近参与了一个项目,出于性能原因,我们需要从Linq To SQL更改为NHibernate.特别是L2S实现对象的方式似乎比NHibernate同样慢,而且变更管理也很慢.对于不需要的特定方案,可能很难关闭变更管理.

如果您打算使用与DataContext断开连接的实体 - 例如在WCF场景中 - 您可能会在将它们再次连接到DataContext以更新更改时遇到很多麻烦.我对NHibernate没有任何问题.

我将从L2S中遗漏的东西主要是代码生成,它使实体两端的关系保持最新.但我想NHibernate也有一些工具可以做到这一点......


为了防止其他人阅读您的帖子并且正在考虑跳船 - 在您的`DataContext`上``.ObjectTrackingEnabled = false`将解决您的更改跟踪问题.只要您购买工作单元模式并且不打算进行DDD,Linq-to-SQL就能真正实现.

5> Jon Galloway..:

你能澄清"LINQ"的意思吗?

LINQ不是一种数据访问技术,它只是一种支持查询作为本机构造的语言功能.它可以查询支持特定接口的任何对象模型(例如IQueryable).

许多人将LINQ To SQL称为LINQ,但这一点都不正确.Microsoft刚刚发布了.NET 3.5 SP1的LINQ To Entities.此外,NHibernate有一个LINQ接口,因此您可以使用LINQ和NHibernate来获取数据.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有