目前有两个被忽略的问题:
LINQ to SQL 无法与 Oracle 或除 SqlServer 以外的任何数据库一起使用。 但是第三方提供了更好的对 Oracle 的支持,例如 devArt's dotConnect、DbLinq、Mindscape's LightSpeed 和 ALinq。(我没有亲身体验过这些)
Linq to NHibernate 允许您在 Nhiberate 中使用 Linq,因此它可能消除了不使用它的原因。
此外,新的Nhibernate 流畅接口似乎使配置 Nhibernate 的映射变得更加轻松。 (消除了 Nhibernate 的痛点之一)
更新
Linq to Nhiberate 在现在的 Nhiberate v3 中更好,该版本现在处于alpha版。看起来 Nhiberate v3 可能会在今年年底发布。
自 .net 4 开始,Entity Frame Work 也开始成为一个真正的选择。
@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也有一些工具可以做到这一点...
DataContext
上设置.ObjectTrackingEnabled = false
将解决你的更改跟踪问题。只要你接受工作单元模式并不打算进行DDD,Linq-to-SQL真的可以发挥作用。 - mattmc3你能解释一下“LINQ”的意思吗?
LINQ并不是一种数据访问技术,它只是一种语言特性,支持将查询作为本地构造。它可以查询任何支持特定接口(例如IQueryable)的对象模型。
许多人将LINQ To SQL称为LINQ,但这完全不正确。微软刚刚发布了.NET 3.5 SP1的LINQ To Entities。此外,NHibernate具有LINQ接口,因此您可以使用LINQ和NHibernate来访问数据。
如你所写,“对于那些没有使用过它们的人” LINQ to SQL易于使用,因此任何人都可以轻松使用它 它还支持存储过程,这在大多数情况下都很有帮助。 假设您想从多个表中获取数据,然后编写一个存储过程并将该存储过程拖到设计器中,它将为您创建一切, 假设您的存储过程名称是“CUSTOMER_ORDER_LINEITEM”,它从这三个表中提取记录,然后只需编写
MyDataContext db = new MyDataContext();
List<CUSTOMER_ORDER_LINEITEMResult> records = db.CUSTOMER_ORDER_LINEITEM(pram1, param2 ...).ToList<CUSTOMER_ORDER_LINEITEMResult>();
你也可以在foreach循环中使用你的records对象,这是NHibernate不支持的。
或者你可以使用Castle ActiveRecords项目。我最近在一个遗留项目中使用了它来快速启动一些新的代码。它使用NHibernate并且基于活动记录模式(尽管名字有些让人惊讶)。虽然我没有尝试过,但我认为一旦你使用了它,如果你感觉需要直接使用NHibernate支持,那么你就可以这样做,而这不会太困难,可以应用到你的整个项目中或其中的部分。