比较 NHibernate 和实体框架

葡萄牙的一位开发者 Ricardo Peres 最近发布了一篇文章,以看起来无偏见的形式对领先的两种 .NET ORM:NHibernate 和实体框架进行了比较。 我们建议考虑使用这两种框架的人都应该读下他的文章,NHibernate 和实体框架之间的区别,另外还将指出一些关键的区别。

从架构上看,NHibernate 基于 Java 的 Hibernate ORM。 Ricardo 写道:

在 NHibernate 中,工作单元和配置项以及模型实例都相互独立。 你首先会创建 Configuration 对象,在其中你会指定所有 NHibernate 设置,像要使用的数据库和语言、批处理的大小、映射关系等等,然后你会依此构建 ISessionFactory。 ISessionFactory 会持有与特定数据库绑定的模型和元数据,以及来自于 Configuration 对象的设定,并且,一般每个进程中只有一个实例。 最终,你会基于 ISessionFactory 创建 ISession 的示例,它是工作单元(Unit of Work)以及标识符地图(Identity Map)的 NHibernate 表现形式。 这是一种轻量级的对象,它本质上会根据需要打开和关闭数据库连接,并跟踪与之相关的实体。 ISession 对象很容易创建和销毁,因为所有的模型复杂性都存储在 ISessionFactory 和 Configuration 对象中。

评论者 Morten Mertner 说:“我永远都不会使用 NHibernate。 尽管它拥有很棒的特性列表,但它并非一种能够轻松使用的产品,而且 API 和设计中始终带有遗传自 Java 的味道(同样,很多 Java API 都太企业化,并且架构过于庞大;结果会与你想要的大相径庭)。”

实体框架遵循的是更加传统的 .NET 设计,其中所有一切都封装在单独的 ObjectContext 或者 DbContext 中。 这让使用对象更加简单,但是缺点在于“类并没有因此是轻量级的,因为它有与 NHibernate 类似的内容,并且一般不会看到这样的例子:实例可以缓存在字段中。”

对于映射,NHibernate 和实体框架之间的关键区别在于,前者支持基于 XML 的映射文件,该文件可以独立部署。 在理论上,这让你可以针对不同的数据库 schema 使用相同的对象模型,而不需要重新编译应用程序。 但在实践中很少这么使用。

在很多方面古老一些的 NHibernate 要优于实体框架。 Ricardo 提供了更多细节,并简要地总结如下:

  • 关联: 都支持一对一、一对多、多对多,但是 NHibernate 还支持各种排序、未排序和索引的选项。 它甚至还有不变的(immutable)、索引的(indexed)列表。
  • 缓存: NHibernate 提供了带有大量实现的二级缓存。 实体框架没有任何对此内建的支持,但是有些增加二级缓存的例子
  • ID 生成: NHibernate 提供了大概十二种策略,这取决于你如何计算。 实体框架只为 SQL Server 提供了主要的三种: 标识符列、GUID、和手动赋值。
  • 事件: 实体框架只有两种基于事件的扩展点: ObjectMaterializedSavingChanges。 “NHibernate 拥有非常丰富的事件模型,暴露了超过 20 种事件,有些针对同步前执行(synchronous pre-execution),有些针对异步后执行(asynchronous post-execution)”。
  • 级联: “两种框架都支持集合和关联的级联: 当实体被删除的时候,相关的子实体也会被删除。 NHibernate 还提供了一种特性,可以把子实体上的外键设置为 NULL,而不删除它们。”
  • 清理变更: NHibernate 提供了一种自动模式,其中在必要的时候会保存变更,像“如果有一种实体类型的脏实例,而查询是针对这种实体类型执行”。 FlushMode.Auto 实际上是默认值,但偶尔会看到由于自动清除而导致性能问题

也有一些领域中,实体框架会比 NHibernate 好,比方说:

  • 跟踪变更: 尽管两种框架在工作单元级别默认都能够跟踪变化,而实体框架还提供了自我跟踪实体(self-tracking entities)
  • 整合: 实体框架当然会与 Visual Studio 和各种 ASP.NET 以及 WCF 类库有很好的绑定。
  • 文档: “这是另一种实体框架表现非常好的地方: NHibernate 缺少针对初学者的文档,并且也没有与其最新版本同步的最新 API 参考。”
  • 查询: Craig 写到:“NHibernate 有更丰富的特性,但有一个领域除外,那就是对 Linq 的支持。 因为对于很多用户来说,Linq 或者其它查询语言都是 ORM 中最可见的部分,它会让人对功能产生错误印象。”

还有某些领域,两种框架都可以做出改进,像批处理功能。 当需要真正支持 SQL 的高级特性——像通用表表达式——的时候,两种 ORM 框架都无法支持 SQL Alchemy

我们应该发现两个项目都很活跃,经常会有定期的改进。 所以,如果二者都能够满足你的最小需求,那么考虑就更多集中在程序库的设计模式和哲学上,而不是在特性列表上。

微软下周公布重大消息 网友盼发布Win8

据国外媒体报道,微软最近广发媒体邀请函,宣称在本月6月18日(下周一),将在美国洛杉矶对外公布一项重大消息,外传很有可能发布新操作系统Windows 8,但微软对此却不肯透露半点消息,仅称这个重大消息是你绝不想错过的消息,连举行地点也是当天早上才会公布。

这项消息引起许多网友的关注,根据国外媒体指称,这个消息很有可能是跟微软的Windows on ARM计划有所关连,但更多网友希望到时公布的消息内容为新操作系统Windows 8,因根据先前的报导指称,该系统将会是其是一项跨笔电、平板电脑甚至电视的跨平台操作系统,也是其用来对付主要对手苹果的最佳武器。

软件开发如同越狱

如果说这世界上有一种东西太多了,那它就是广告。如果说这世界上还有另外一种东西太多了,那就是对软件开发的类比。尽管如此,今天我还是要编造一个。你知道软件开发像什么吗?它像越狱。

回想一下你最喜欢的越狱类型的电影,不论是《大逃亡》、《肖申克的救赎》,还是享誉海内外的电视剧《越狱》或者是《勇闯夺命岛(the Rock)》(不好意思,这不是越狱,而是关于潜入监狱的)。但这跟我们有什么关系?

“我们都是来自五湖四海,为了一个共同的革命目标走到一起来了。”

在一个越狱团队里,有一伙人是专门负责挖地道的,另一伙人是负责清除挖地道的痕迹的,还有一伙人是负责弄假身份证和假发的——一旦越狱成功就需要用 到这些。在影片的前半部分,你毫无例外的能找到一幕场景来证实他们起初是多么的相互讨厌。但一旦达成了越狱的共识,他们立即变成了能为对方两肋插刀的兄 弟。

在一个典型的开发软件的组织里,程序员,市场销售,业务经理,管理人员,以及投资者,这是一群不会有第二种理由能把他们聚到一起的人。它不次于任何 世界上最奇异的家族组成。然而,这最终的目标——成为市场霸主,百万美元的收入,或者仅仅是为了取悦用户——这以足够让这群奇异组合的人在最高强压力的环 境形势中共同度过一年半载。周末取消了,节假日忘了,你的孩子在众人面前指着你说“这个臭臭的家伙偶尔会到我家来换内衣,而且冲着我们大呼小叫”,这些全 是为了软件。

一伙敌对势力百般阻挠越狱

在越狱电影里,总有一批狱警在防范犯人越狱。我们通常会看到的一幕是另外一伙人企图越狱结果失败了。我们多少会发现,这些狱警多少有些愚蠢。

相似的,你的对手也在坚持不断的试图阻止你从将要发布的伟大的软件中获取丰厚的回报。这对手可能是市场上的一家竞争公司,或是公司内的某一个部门。不管怎样,你的相当大的一部分精力被消耗在担忧防范这些敌对势力上。

不巧的是,敌对势力都不怎么聪明。

是否还记得,在所有的这些电影里,犯人是如何一次次的成功把挖隧道的泥土转移的监狱院子里,所以没有人知道他们在挖洞。还有他们如何晚上把用袜子做 的假人放到床上,这样狱警就没发现他们的缺寝。如果这些狱警稍微聪明一点,尽职一点,他们就会发现这些猫腻。但这种情况永远都不会发生。

你的软件开发团队的敌对势力也跟此差不多。你很可能无时无刻的不在担心他们已经搞清楚了你们在开发什么——根据你网站上的一些描述,或广告宣传中泄 漏出来的一些信息。哦,天哪,也许他们在我们的测试环境中已经注册了帐户!你会担心,他们一旦知道了你的产品,他们会在市场上打败你,偷走你的钱、声誉, 以及伴随它们而来的锦绣前程。但你担心的这些事情可能永远都不会出现。

成年累月的苦干。

毫不奇怪的事实:从监狱下面挖一条隧道,穿过围墙,你需要做很多的工作。尤其是当你只有一把勺子的情况下。

同样的境遇,开发软件也是一个苦力活。无论你有多少开发经验、理论指导、开发工具,你最终难免少不了昏天黑地的敲打键盘。完全不是一种让人兴奋的运 动;也许你宁愿用一把勺子去挖穿一堵墙,也不愿重新整理你代码里密码重设的逻辑。尽管如此,为了目标必须做这些,所以我们编呀编啊编。

紧接着是惊心动魄的一刻。

当犯人最终逃出监狱时会发生什么?最不想看到的事情全都出现:有人意识到他们的假身份证永远等不到了,有一个警察模样的人正站在他们集合点的前面,警察和警犬的声音从几百米外的地方传来。

软件的发布与此很相似。本以为是一个欢欣鼓舞的时刻,结果情况急转直下,生产环境宕机,谷歌不知什么原因拒绝收录你的网站,系统中的一个bug导致多收了用户10倍多的钱。

万岁,我们成功的越狱了,一切顺利!除非事情没按这样发生。

让人惊奇的是,在所有的老调重弹的越狱模式电影中,在影片的末尾,故事开始出现分歧。有些结局是高兴的,所有人都获得了自由。而另一些电影中,没有 一个人逃脱。剩下的一些电影中两种情况混合到一起,一些人逃出去了,余下的人要么被抓住,要么被打死,要么被警犬咬住不放。故事的结局通常不会是过度沮丧 的,因为还要留一些拍续集的情节线索。

软件开发也是这个套路。结局有高兴的,不高兴的,或喜忧参半的。世界就是这样,尽管我们做出了很大的努力,付出了很多牺牲,但不必一定能换来成功, 所以,我们应该把重点放到软件开发自身的过程上。我们在其中获得了乐趣,我们相互关怀,相互学习。我们应该明白,虽然最终的成败与否带有一些靠天的成分, 但我们在做优秀的工作、开发杰出的软件过程中获得的满足不会因此而减少。

如果世界正向我们预期的方向运转,那是再好不过。如果不是,至少我们的续集有了一个很好的基础。

[本文英文原文链接:Building Software Is like Escaping from Prison ]

Linux 创始人在芬兰获奖

近日,芬兰技术学会(Technoloy Academy Finland)向 Linux 创始人林纳斯•托瓦兹(Linus Torvalds)颁发了 2012 年度的“千年技术奖”。芬兰技术学会称,把这一奖项颁给托瓦兹是因为“他对共享软件的发展和互联网的开放起了非常重要的作用。”

不过,托瓦兹决定,他将和来自日本的骨髓干细胞学家山中伸弥共享这一奖项。这是该奖史上第一次出现两人同享一奖的情况。据悉,他们二人将各自获得 60,000 欧元的奖金。

1991 年,还在芬兰赫尔辛基大学读书的托瓦兹发明了 Linux 操作系统,而当他在 Usenet 上发布 Linux 时,他还仅仅将 Linux 视作他的“个人爱好而已,Linux在将来不会发展成大型的专业操作系统。”不过,时过境迁,现在的 Linux 已经成为了世界知名的开源操作系统了。

自 Linux 发布以来,其内核几经修改。如今,许多电脑服务器、数码录像机、股票交换设备中搭载的都是基于 Linux 的系统,其中,还包括了谷歌的智能手机平台——安卓。

在某种程度上而言,Linux 就代表了互联网时代的自由与开放。在 Linux 社区中,每天都有许许多多的人在为这个开源的操作系统添砖加瓦,而也正是因为它的开放性和共享性,Linux 才能达到今天的发展水平。

托瓦兹现今在自己家中的办公室工作,他坦承,曾有许多科技公司希望把他招致麾下,然而他都一一拒绝了。“我希望向所有人表明,我最在意的是我中立的立场,并且,我认为,这也是所有使用 Linux 系统的公司都希望看到的。”他补充道,“Linux 核心已经越来越壮大,也被越来越多的公司所采用,而我相信,人们最希望看到的,肯定还是我不为任何一家公司工作,保持中立。”