繁体   English   中英

在Linq to SQL中重写NHibernate应用程序

[英]Rewriting NHibernate app in Linq to SQL

我有一个使用NHibernate编写的旧的过时应用程序。 现在我想重写它,包括新功能和模型的重大变化。

使用Linq to SQL而不是NHibernate的主要缺点是什么?

使用LINQ to SQL可能存在哪些问题,是否使得DataContext像singleton一样会导致性能不佳?

“在DAL中封装数据访问的错误神话”

“我想使用NHibernate设计一个系统/应用程序。但是我也想要如此灵活,以后如果我拔掉NHibernate并使用ADO.NET Entity框架或其他框架,那么我的应用程序不应该崩溃。”

简而言之,我甚至完全反对尝试这样的事情。

它基于有缺陷的假设

这背后的许多驱动力是基于在数据访问层使用自己的方言直接访问数据库的时间内构建的历史驱动器,导致需要创建这样的封装以支持多个数据库。

这个驱动器的问题在于它不再是一个因素,所有现代OR / Ms都可以有效地处理多个数据库。 而且,现代OR / M不再仅仅是执行某些SQL并获得结果的方法,这就是DAL的旧式写法。 OR / M承担更多责任,从更改跟踪到缓存管理,从确保乐观并发到管理与数据库的最佳通信。

这些功能很重要。 不仅如此,它们在每个OR / M之间也不同。

它不起作用,你会发现它太晚了

主要的问题是,无论你怎么努力,不同的OR / Ms之间都会有微妙而不那么微妙的差异,这些变化会极大地影响你构建应用程序的方式。

那么你如何在OR / Ms之间移动?

有些人希望从一种数据访问技术转移到另一种数据访问技术。 我参与了几个这样的工作,我们在每个案例中使用的方法是移植 ,而不是试图删除新的IDataAccess实现。

很大的问题,但是我在L2S到NHibernate 2.x的大型重构中意识到的一件事是,NHibernate允许基类在不同的物理表中表示而不是衍生物。 但是对于L2S,我被迫使用1个单独的表来表示基础,并且每个类都会扩展它。

这允许我创建更小的表,因为我有一个基类,它由大约25种不同的子类变体继承。 如果您希望继续使用此功能,它可以帮助简化您的架构。

使用Linq to SQL而不是NHibernate的主要缺点是什么?

LINQ to SQL的优点

  • 更高级和更易于使用(IMHO)查询语法,特别是它使用LINQ执行查询,这为您提供强类型/编译时安全查询。 NHibernate为您提供了HQL,虽然它非常强大,但它都是基于字符串的。 NHibernate还有一些Criteria查询,它有点强类型(仍然是一些字符串),但它的语法/ API很难让人知道。

NHibernate v2确实有一个你可以下载的LINQ提供程序,但它有点缺乏(事实上很多缺乏),它不支持大量的用例。 NHibernate 3.0附带了自己的内置LINQ提供程序,它功能更强大,几乎与LINQ 2 SQL或EF相当。


LINQ to SQL的缺点

几乎所有其他的! 说真的从哪里开始:

  • 简单表到实体映射,不像NHibernate,它具有更强大的映射功能,包括:单向关联,组件映射,您可以映射值类型的集合,例如public IList<string> Tags {get; set; } public IList<string> Tags {get; set; } 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则以域的更多业务/行为为中心。

说真的,采用NHibernate应用程序并将其“降级”为LINQ 2 SQL似乎是倒退了一步。 如果你想使用更多的微软,至少考虑使用Entity Framework 4.0。 LINQ 2 SQL拥有更简单的应用程序,只有几个表,但更复杂的东西需要更强大的ORM。

当我正在构建一个应用程序,它有一个简单的域和一个基本架构时,我喜欢Linq2Sql。 Linq写得很快,我可以快速完成任务。 我意识到那里有一个Linq2NHibernate,但我不确定它的成熟度是多少。 一些缺点,IMO到Linq2Sql必须在架构更改时重新生成类和DataContext,并且必须从Linq2Sql生成的类映射到我的域对象。 对于小型简易项目,我真的不介意这样做。 虽然使用FluentNHibernate和Linq2NHibernate,但我可能能够像使用Linq2Sql一样高效地使用NHibernate,但我还没有尝试过。

我在一个项目上使用Linq2Sql在过度规范化的数据库上使用了一个有点复杂的域,这是一场噩梦。 它起作用了,我们能够从中获得一些好的表现,但可维护性几乎不存在。 但是对于架构的方式,我不确定NHibernate,或者直接SQL会改变它。 这是一个毫无疑问的案例,文档数据库应该是可行的方法。

如果该项目已经完成了NHibernate,并且你有这种经验,我会坚持下去。 您可以直接映射到域对象的事实很棒。 当架构在开发早期发生变化时,Linq2Sql代码生成可能会很痛苦。 最重要的是,Linq2Sql实际上已经死了。 MS将其所有ORM蛋放入实体框架篮子中。

你可能只需要LINQ-ify你的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: }

之后(LINQ to NHibernate)

   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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM