日期:2014-05-20  浏览次数:20686 次

召唤NHibernate和Linq to SQL高手
有没有哪位朋友用过这两种方法,比较一下pros&cons. 我们开发小组前几个项目是用的Linq to SQL, 一致认为对于快速开发,小型项目,Linq to SQL是绝对的好选择。最近小组又在一起开发一个大一点的项目,试着使用NHibernate, 到目前为止,我们解决了遇到的问题, NHibernate看起来没有问题。mapping的时候,我们对HHibernate的配置不是很熟,但是还是解决了。如果用Linq to SQL,更简单, 只要搞一个DBML,直接把表拖进来就能用了。请大家对这两种方法的优缺点评论一下。还有我们小组的老大写了一个blog也是关于这个,大家可以去看,提点评论。欢迎技术讨论!非常感谢!
http://derans.blogspot.com/2009/07/linq-to-sql-vs-nhibernate.html

------解决方案--------------------
EF!
简单就是美.
------解决方案--------------------
看看
顶顶
------解决方案--------------------
帮顶
------解决方案--------------------
帮顶,能有效解决问题和能简单维护的都可以
------解决方案--------------------
用NHibernate


------解决方案--------------------
正在学习LINQ
------解决方案--------------------

------解决方案--------------------
关键看你的应用程序的需求,如果规模不大,而且LINQ to SQL能够解决你的问题,何乐而不为?
个人偏向于NHibernate,因为从领域驱动设计的方向考虑,LINQ to SQL已经本末倒置了:先有数据库表的结构再有领域实体,这是面向数据库的设计,而不是领域驱动设计。

------解决方案--------------------
优缺点:
LINQ to SQL简单,对于从数据库设计出发的应用,是一个不错的选择,但只能适用于小型软件系统,因为面向数据库的设计会麻痹人的“面向对象”神经,对于业务复杂的大型系统,面向数据库的设计会使人迷失方向。
NHibernate复杂,配置和事务处理都需要经过深思熟虑,但它的引入会将领域实体与基础结构层实现解耦,是符合领域驱动设计思想的。

------解决方案--------------------
真正的领域驱动设计,你是不会去考虑你的系统是否有数据库的。Evans的DDD中很少提及数据库这类概念,而更多的是在讲仓储。
LINQ to SQL还有个致命伤,就是对值对象的支持。Jimmy在InfoQ中讨论过这个问题,由于LINQ to SQL不像NHibernate那样能够很好地支持值对象,因此,他觉得自己很难适应LINQ to SQL的做法。

“我们开发的时候是先设计Model, 再对这些对象写Repository,然后才是拖数据库的表,再mapping,再写filter等。”

先设计Model,再写Repository,从分析流程上看是没错,但“拖数据库的表”就感觉无法让人接受。数据库表是从哪里来?通过设计时模型的描述,手动地在SQL Server或者Oracle上建立的么?那如果设计时模型改了怎么办?是不是也要修改数据库中的表?当然visual studio会使用refactor来同步其本身的Model,但是由于数据库的更改而去改变Model,这本身就搞反了。
从NHibernate对SchemaExport和SchemaUpdate的支持能够看出,NHibernate是有能力通过模型来同步持久化机制(也就是目前谈论的最多的“数据库”)的,如果你的模型改变了,SchemaUpdate可以以增量方式同步你的持久化机制,那么此时你的数据库中的表有可能一团糟,比如某些表因为模型对象的删除而不再使用,而某些字段又因为模型对象属性的添加而添加。但这都没有关系,NHibernate会帮你处理这些事情,你只需要关注你的模型就行了,数据库到底成什么样,你根本不需要去考虑。

相关文献你可以参阅:
面向数据库与面向对象的一些理解
数据库时代的终结
数据库已死
------解决方案--------------------
用entity framework 用实体模型来做 既有linq to sql的简单 能站对实体模型的操作来完成数据库的操作
------解决方案--------------------
Nhibernate只是数据访问层,在很大程度上受存储结构的限制,其实存储结构与域模型应区分开设计
------解决方案--------------------
如果LZ用hibernate的话, 推荐使用Castle的Active Record, 
基于hibernate, 但改进很多.
------解决方案--------------------
up
------解决方案--------------------
探讨
如果LZ用hibernate的话, 推荐使用Castle的Active Record,
基于hibernate, 但改进很多.