作为一个没有在现实世界项目中使用这两种技术的人,我想知道是否有人知道这两者如何相互补充以及它们的功能重叠多少?
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不适用于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 的实体框架工作也开始看起来像一个真正的选择.
@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可以
自动为您完成此操作.
Fluent NHibernate可以根据简单的约定生成映射文件.没有XML编写和强类型.
我最近参与了一个项目,出于性能原因,我们需要从Linq To SQL更改为NHibernate.特别是L2S实现对象的方式似乎比NHibernate同样慢,而且变更管理也很慢.对于不需要的特定方案,可能很难关闭变更管理.
如果您打算使用与DataContext断开连接的实体 - 例如在WCF场景中 - 您可能会在将它们再次连接到DataContext以更新更改时遇到很多麻烦.我对NHibernate没有任何问题.
我将从L2S中遗漏的东西主要是代码生成,它使实体两端的关系保持最新.但我想NHibernate也有一些工具可以做到这一点......
你能澄清"LINQ"的意思吗?
LINQ不是一种数据访问技术,它只是一种支持查询作为本机构造的语言功能.它可以查询支持特定接口的任何对象模型(例如IQueryable).
许多人将LINQ To SQL称为LINQ,但这一点都不正确.Microsoft刚刚发布了.NET 3.5 SP1的LINQ To Entities.此外,NHibernate有一个LINQ接口,因此您可以使用LINQ和NHibernate来获取数据.