上篇文章详细讨论了FluentNHibernate的基本映射的使用方法,它的映射基本用法是跟NHibernate完全一样的,首先要创建数据库链接配置文件,然后编写Table的Mapping,最后编写Unit Test来测试模块Mapping是否成功执行。FluentNHibernate之所以替代NHibernate并不仅仅是因为对Mapping配置文件的优化,另外它换可以优化数据库的链接xml以及规避Mapping文件的编写,这种完全自动化的编程方法就是AutoMapping,FluentNHibernate封装了自动化映射的方法,使得开发人员只需要几种到对Table的修改中,而不需要考虑数据模型到对象模型的转化过程。
在项目中如果使用了AutoMapping那么它的具体的架构图如下
上面的架构图使用了AutoMapping,它的使用能够避免繁杂的Mapping文件的编写,也就是说NHibernate在访问数据库时首先要从FluentNHibernate那里获取对象和数据是如何相互转化的,然后FluentNHibernate会从AutoMapping中获取各种映射的规则,也就是说AutoMapping只需要重写对象模型的映射规则就可以实现完全的映射,这样就使得程序的开发变得相当简单。
上文使用架构图对FluentNHibernate的AutoMapping做了初步的解读,可以看出AutoMapping是依附于FluentNHibernate的,而且FluentNHibernate是依附于NHibernate的,它们三者首先是NHibernate先工作,查找到FluentNHibernate,然后是FluentNHibernate查找到AutoMapping的规则,按照规则进行映射。
往往在开发时我们都会把Mapping和Models放到Core的程序集内,供其它层的程序集调用,如上图的Repository层,是对数据库做的一系列操作,都封装到该层中。
在没有AutoMapping情况下如果使用FluentNHibernate来实现映射的话,首先要创建Mapping文件,然后对每个Entity都做Mapping代码的编写,但是这样就太麻烦了,因为如果有很多表的话一个个的编写Mapping很浪费时间,同时也会产生很多冗余的Code,所以这时候可以考虑使用AutoMapping来映射文件,只不过需要按照创建的规则来创建数据库的。
(1)创建AutoMapping的映射配置类,继承DefaultAutomappingConfiguration类,并重写ShouldMap方法,指定实体类所在的命名空间
(2)实现映射的接口,定义Entity到Table自动Mapping的规则,主要的接口如下:
IClassConvention,Entity Class到Table的映射,需要实现指定Table名称的Apply方法,默认情况下是以Entity的名称作为Table名称。
IIdConvention,Entity Class到Table ID的映射规则,需要实现指定Table ID生成的规则及ID的生成规则等,如果不实现该接口的话默认情况下会以“实体名_ID”形式命名Table的ID。
IReferenceConvention,Entity Class到Table的外键列映射规则,需要实现Apply方法,来指定外键列名称的生成规则及连接对象的加载规则,默认情况下会以“外键对象_ID”形式命名外键列。
IPropertyConvention,Entity Class属性到Table列名称的生成规则及加载规则,默认情况下会以属性名作为Table的列名。
IHasOneConvention,Entity Class一对一映射的规则及列的生成规则,需要实现Apply方法指定外键列的命名规则,同时也可以规定外键对象的加载和操作方式,默认情况下会以“对象_ID”形式命名。
IHasManyConvention,Entity Class一对多映射的规则及列的生成规则,需要实现Apply方法指定列的命名规则,同时也可以规定外键对象的加载和操作方式,默认情况下会以“对象_ID”形式命名。
IHasManyToManyConvention,Entity Class多对多映射的规则及列的生成规则,需要实现Apply方法指定关联表及关联表中列的命名规则,默认情况下会以“对象_ID”形式命名列名,“对象To对象”形式命名表名。
上文对AutoMapping的使用过程做了详细的讨论,接下来我们将会创建一个代码实例来讨论AutoMapping的具体使用方法。
这里还以上文中的数据结构图为例来详细的讨论AutoMapping的使用方法,示例中使用的AutoMapping自动生成的数据库结构图如下:
在项目中如果使用了AutoMapping那么它的具体的架构图如下
一、AutoMapping
上文使用架构图对FluentNHibernate的AutoMapping做了初步的解读,可以看出AutoMapping是依附于FluentNHibernate的,而且FluentNHibernate是依附于NHibernate的,它们三者首先是NHibernate先工作,查找到FluentNHibernate,然后是FluentNHibernate查找到AutoMapping的规则,按照规则进行映射。
往往在开发时我们都会把Mapping和Models放到Core的程序集内,供其它层的程序集调用,如上图的Repository层,是对数据库做的一系列操作,都封装到该层中。
1.1 AutoMapping详解
(1)创建AutoMapping的映射配置类,继承DefaultAutomappingConfiguration类,并重写ShouldMap方法,指定实体类所在的命名空间
(2)实现映射的接口,定义Entity到Table自动Mapping的规则,主要的接口如下:
IClassConvention,Entity Class到Table的映射,需要实现指定Table名称的Apply方法,默认情况下是以Entity的名称作为Table名称。
IIdConvention,Entity Class到Table ID的映射规则,需要实现指定Table ID生成的规则及ID的生成规则等,如果不实现该接口的话默认情况下会以“实体名_ID”形式命名Table的ID。
IReferenceConvention,Entity Class到Table的外键列映射规则,需要实现Apply方法,来指定外键列名称的生成规则及连接对象的加载规则,默认情况下会以“外键对象_ID”形式命名外键列。
IPropertyConvention,Entity Class属性到Table列名称的生成规则及加载规则,默认情况下会以属性名作为Table的列名。
IHasOneConvention,Entity Class一对一映射的规则及列的生成规则,需要实现Apply方法指定外键列的命名规则,同时也可以规定外键对象的加载和操作方式,默认情况下会以“对象_ID”形式命名。
IHasManyConvention,Entity Class一对多映射的规则及列的生成规则,需要实现Apply方法指定列的命名规则,同时也可以规定外键对象的加载和操作方式,默认情况下会以“对象_ID”形式命名。
IHasManyToManyConvention,Entity Class多对多映射的规则及列的生成规则,需要实现Apply方法指定关联表及关联表中列的命名规则,默认情况下会以“对象_ID”形式命名列名,“对象To对象”形式命名表名。
(3)编写Unit Test运行AutoMapping的配置文件,生成NHibernate的映射xml,查看映射是否成功。
1.2 实例详解
这里还以上文中的数据结构图为例来详细的讨论AutoMapping的使用方法,示例中使用的AutoMapping自动生成的数据库结构图如下: