我有一个使用NHibernate编写的旧应用程序,现在我想重写它并包含新功能和模型中的大变化。
使用Linq to SQL而不是NHibernate的主要缺点是什么?
使用LINQ to SQL可能会出现哪些问题?将DataContext设置为类似单例的东西会导致性能差吗?
我有一个使用NHibernate编写的旧应用程序,现在我想重写它并包含新功能和模型中的大变化。
使用Linq to SQL而不是NHibernate的主要缺点是什么?
使用LINQ to SQL可能会出现哪些问题?将DataContext设置为类似单例的东西会导致性能差吗?
"我想使用NHibernate设计一个系统/应用程序。但是,我也希望非常灵活,以便将来,如果我拔掉NHibernate并使用ADO.NET Entity Framework或其他框架,则我的应用程序不会崩溃。"
简而言之,我完全反对尝试做这样的事情。
它基于错误的假设
这背后的许多动力都是基于历史上建立的驱动程序,在那个时候,数据访问层直接使用其自己的方言访问数据库,导致需要创建这样的封装以支持多个数据库。
这个驱动的问题在于它已不再是一个因素,所有现代的ORM都可以有效地处理多个数据库。此外,现代的ORM不再只是执行一些SQL并获得结果的方式,这就是旧式DAL的编写方式。ORM承担了更多的责任,从变化跟踪到缓存管理,从确保乐观并发到管理与数据库的最佳通信等。这是一个很大的问题,但在从L2S到NHibernate 2.x的大规模重构期间,我意识到NHibernate允许将基类表示为与派生类不同的物理表。但是,在L2S中,我被迫使用1个单一的表来表示基类和每个扩展它的类。
这使我能够创建较小的表,因为我有一个基类,由大约25个不同变体的子类继承。如果您希望以后使用此功能,它可以帮助简化架构。
public IList<string> Tags {get; set; }
,继承映射(非常强大),枚举映射,等等……
- 您的实体与LINQ to SQL紧密耦合,这可能会影响单元测试。NHibernate支持POCO映射,对于实现松散耦合、可维护、可单元测试的代码库非常重要。
- 支持更多数据库(SQL Server、MySql、PostgreSQL、Oracle、SQLite等)。LINQ 2 SQL仅支持MS SQL Server。
- 使用NHibernate可以在应用程序中实现DDD(领域驱动设计)原则。LINQ 2 SQL更多地是关注您的领域模型的数据库中心视图,而NHibernate则采用更具业务/行为中心的领域视图。http://www.hookedonlinq.com/LINQToNHibernate.ashx
一些额外的阅读材料:http://www.caffeinatedcoder.com/linq-to-nhibernate/
引用:
由于新的NHibernate LINQ提供程序,我现在可以以更安全的方式工作,而且代码也更易读。
看看这些查询之前和之后的变化,自己来评判:
之前(Criterion API)
1: public IList<Call> GetCallsByDate(DateTime beginDate, int interpreterId)
2: {
3: ICriteria criteria = Session.CreateCriteria(typeof(Call))
4: .CreateAlias("Customer", "Customer")
5: .Add(Restrictions.Gt("StartTime", beginDate))
6: .Add(
7: Restrictions.Or(
8: Restrictions.Lt("EndTime", DateTime.Now), Restrictions.IsNull("EndTime")
9: )
10: )
11: .Add(Restrictions.Eq("Interpreter.Id", interpreterId))
12: .AddOrder(Order.Desc("StartTime"))
13: .AddOrder(Order.Desc("Customer.Name"));
14:
15: return criteria.List<Call>() as List<Call>;
16: }
1: public IList<Call> GetCallsByDateWithLinq(DateTime beginDate, int interpreterId)
2: {
3: var query = from call in Session.Linq<Call>()
4: where call.StartTime > beginDate
5: && (call.EndTime == null || call.EndTime < DateTime.Now )
6: && call.Interpreter.Id == interpreterId
7: orderby call.StartTime descending, call.Customer.Name
8: select call;
9:
10: return query.ToList();
11: }
如果我记得正确,Linq2Sql 对于多对多表关系的支持并不好
http://www.chrisbrandsma.com/2007/08/linq-to-sql-many-to-many-tables-and.html