InfoQ 之前报道过,我们可以在 NHibernate 中使用 XML 映射,这就是连贯 NHibernate。连贯 NHibernate 使用连贯接口,通过编码的方式代替XML 定义映射。有些社区成员抱怨连贯NHibernate 缺乏相关文档,对此James Gregory 最近做出了回应,他发布了连贯NHibernate 的官方Wiki 文档。
Wiki 文档中的包含如下例子:
Wiki 站点把典型的映射解决方案都列举出来了,当中包括 XML 和连贯 NHibernate。下面代码显示的是 XML 部分:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QuickStart" assembly="QuickStart"> <class name="Cat" table="Cat"> <id name="Id"> <generator class="identity" /> </id> <property name="Name"> <column name="Name" length="16" not-null="true" /> </property> <property name="Sex" /> <many-to-one name="Mate" /> <bag name="Kittens"> <key column="mother_id"/> <one-to-many class="Cat"/> </bag> </class> </hibernate-mapping>
下面代码显示相同映射的连贯 NHibernate 代码:
public class CatMap : ClassMap { public CatMap() { Id(x => x.Id); Map(x => x.Name) .WithLengthOf(16) .Not.Nullable(); Map(x => x.Sex); References(x => x.Mate); HasMany(x => x.Kittens); } }
文章还提到:
尽管 XML 代码的部分比较优美,但是它可能会导致意想不到的结果。
接着,文中还列举了一些例子:
- 由于编译器并不对 XML 进行估算,我们可以在映射中对未更新的类的多个属性进行重命名。在这种情况下,直到运行时才会发现解析映射的问题
- XML 很冗长;NHibernate 逐步减低 XML 的强制元素,但我们仍不能避免 XML 的繁杂性
- 重复的映射 - 如果我们不断地定义同样的规则,就会发现 NHibernate HBM 映射相当的冗长。例如,确保 string 属性为非空且长度为 1000 的时候,以及确保所有的 int 对象的默认值为 -1 的时候
去年的 8 月份,Oren Eini(也叫 Ayende Rahien ) 指出连贯的 NHibernate 并没有任何价值,因为每个实体必须有一个映射类。然而,从那时起,项目就进行革新,现在就有了自动映射的概念,这正是Ayende 所需要的。自动映射特性使用一套规则来自动映射所有实体,并非每个实体都需要映射类。
查看英文原文: Fluent NHibernate Has a Wiki
评论