我应该在ASP.Net MVC项目中使用什么ORM?

7
我正在启动一个新的ASP.Net MVC项目,并想知道最好的模型方法是什么。
大多数演示文稿推荐使用LinqToSQL,但我知道Microsoft并没有真正增强这个产品,而是更专注于Entity Framework。
我喜欢Subsonic的方法,但我认为这将在MVC 3中内置,但这个项目的开发阶段还没有任何消息,所以如果很快会有新版本发布,我有点担心使用版本2。
我听说过NHibernate和Castle Record,但完全没有使用过这些,并且对两者都听到了很多利弊。
任何帮助都将不胜感激!

你是否放弃了Entity Framework(因为你提到了它)?只是这可能更直接。 - dommer
相关链接:http://stackoverflow.com/questions/467620/what-are-the-differences-and-pros-and-cons-of-these-orm-tools-technologies - Cherian
2
还没有解雇它,也没有看过它。听说它很笨重,你觉得怎么样? - Jon
9个回答

11

nHibernate的学习曲线较陡峭,但值得一试。使用Fluent nHibernate可以稍微减轻一点压力。nHibernate不像一些ORM那样具有可视化界面,但这只是初学者面临的问题,一旦您有了经验,缺少可视化设计师实际上会成为一个优点。


我刚刚简单地看了一下NHibernate,它似乎要求我自己创建数据库类,通过在类中键入所有列等信息。如果是这样的话,我不想为大量的表格这样做。 - Jon
你已经在做事情时本末倒置了,应该先从领域模型类开始,而不是从数据库表开始。NHibernate 的方法是,在考虑后面需要哪些数据库表之前,先编写领域模型类。 - yfeldblum
然后你可以让NHibernate为你生成甚至迁移模式! - mookid8000
1
Jon,有很多代码生成工具(例如MyGeneration)可以为您生成类。但正如其他评论所说,nHibernate最适合领域驱动设计,其中您首先设计类。 - Craig
你能解释一下你所说的领域模型类是什么吗?你是指像AddProduct(Product product)这样带有方法的类吗? - Jon
请查看https://dev59.com/-nVD5IYBdhLWcg3wAGeD。 - Craig

6

对于SubSonic,Rob刚刚发布了一个新的MVC模板,您可以在启动新项目时使用它,其中包含许多有用的内容,包括SubSonic 3的预发布版本。详情请参见Rob Conery的博客


刚看到了,我会去看看! - Jon

4

LLBLGenPro 对我来说非常好用。它是最好的 .net ORM 工具。我建议避免使用 Linq to Sql,因为一旦项目变得庞大,你将会遇到问题,并且它在功能方面相对较弱(除了明显的缺点,比如仅支持 SQL Server 等)。


2

我使用linq2sql,如果你的数据库是MSSQL,那么它可以完美运行(它也可以在其他数据库上工作,但需要一些第三方工具)。是的,微软已经“停止”了它的开发,但对于普通项目来说,它已经足够成熟。我怀疑你不会遇到任何障碍。如果您要开始一个需要长期支持的大型项目,则Entity Framework可能更合适。

就我个人而言,我以前没有使用过NHibernate和Subsonic,但像Craig所说,NHibernate的学习曲线有点陡峭,尽管它应该是一个很棒的框架(从我听到或阅读的所有内容来看)。


2
微软并没有停止开发。目前有5名开发人员在开发,而ASP.NET MVC只有3名,这只是为了让大家有个比较。 - Chad Moran
虽然我在引号中放置了“已停用”,但我确信它接近死亡,请参见:http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx 如果你有你所说的来源,我很乐意阅读它 :) - Razzie
1
我在两周前的MIX09晚宴上与Scott Hanselman谈到了这个问题,他说目前有5名开发人员正在处理它。 - Chad Moran
啊,好的,我相信你的话;-)不过这是个好消息,因为我喜欢linq2sql。 - Razzie

2
如果您愿意花一些钱或者有一个较小的项目,我建议尝试一下LightSpeed。我发现每个ORM都有痛点,目前我正在使用LINQ to SQL。
LightSpeed非常丰富,但是LINQ支持缺少一些功能,不过没有什么无法解决的大问题。它与LINQ to SQL和LINQ to Entities非常接近,但是还有一些其他功能,比如全文搜索。

1
我们在这里使用Fluent + NHibernate,它运行得非常好。一些与之相配的替代方案包括SubSonic、Entity Framework和Linq to SQL。我认为直接使用NHibernate有点过于繁琐,但是它是一个很好的底层层与Castle ActiveRecord和Fluent一起使用。

1

Castle ActiveRecord非常适用于基于MVC的中小型项目 - 我目前正在几个项目中使用它,并发现它非常适合ASP.NET MVC。

它是active record pattern的一种实现,底层使用NHibernate - 换句话说,只要您愿意每个数据库表有一个类,它将为您完成大部分NHibernate配置,让您自由编写代码,例如:

Customer bob = Customer.Find(/* customer Id goes here */);
bob.FirstName = "Robert";
bob.Save();

Invoice newInvoice = new Invoice();
newInvoice.Products.Add(Product.Find(/* product ID goes here */);
bob.Invoices.Add(newInvoice);
bob.Save();

有很少的显式NHibernate配置(当然假设你的数据库中有Customer、Invoice和Product表)

因为它是在NHibernate下工作,如果需要迁移到NHibernate应该很简单 - 你已经拥有所有必要的引用和库。 NHibernate行为中有一些方面是你无法忽略的(比如会话范围和刷新),但是弄清楚这些方面并在ActiveRecord中使用它们,将会给你一个优势,即在需要直接使用NHibernate时能够更容易上手。


Castle ActiveRecord是否可以根据你指定的数据库自动生成类? - Jon
不过,它并不会执行相反的操作(基于已注释的类生成数据库架构)。此外还有ActiveWriter - http://using.castleproject.org/display/Contrib/ActiveWriter。作为Visual Studio插件,它提供了可视化设计工具(可以从数据库中拖放创建对象)。 - Dylan Beattie

0

我曾在一个项目中使用过一个名为netTiers(http://www.nettiers.com/)的产品,效果非常好。它是一个CodeSmith脚本,可以从您的数据库表、视图和存储过程生成业务对象。


0
如果这不是一个庞大的项目,我会使用 Linq To SQL。如果你需要所有的功能,那就学习一下 nHibernate 并开始使用它。我认为你无论选择哪种方式都不会遇到任何严重的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接