前言

  使用nhibernate在项目中不管是代码或者xml文件映射方式,如果项目较大编写映射也应该算一笔大的工作量了,使用Fluent Nhibernate自己编写映射规则,将从conventions添加到默认automappingd的规则中,根据规则生成映射,这样可以避免我们编写大量的映射文件。

步骤

1、编写规则指定生成的数据库架构并且生成数据库映射。举例生成如下数据库关系的映射:

2、编写需要映射的持久化模型

基类(只映射继承该基类的模型):

public abstract class Entity
{
virtual public int ID { get; set; }
}

需要映射的模型:

public class User:Entity
{
virtual public string Name { get; set; } virtual public string No { get; set; }
}
public class Project:Entity
{
public Project()
{
Task = new I.HashedSet<Task>();
}
virtual public string Name{ get;set;} virtual public User User { get; set; } virtual public ICollection<Task> Task { get; set; }
}
public class Task:Entity
{
virtual public string Name { get; set; } virtual public Project Project { get; set; }
}

3、实现自定义映射规则

指定需要映射的类型,继承默认的DefaultAutomappingConfiguration,重写ShouldMap()方法,只映射实现Entity的子类:

public class AutomappingConfiguration : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
return type.IsSubclassOf(typeof(Entity));
}
}

IClassConvention表名的生成规则:实体类名+“s”:

public class DefaultTableNameConvention : IClassConvention
{
public void Apply(IClassInstance instance)
{
instance.Table(instance.EntityType.Name+"s");
}
}

IPropertyConvention:指定字符串属性生成表列的长度

public class DefaultStringLengthConvention : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
instance.Length();
}
}

IIdConvention:指定主键名称(类名+“ID”)及增长方式

public class DefaultPrimaryKeyConvention : IIdConvention
{
public void Apply(IIdentityInstance instance)
{
instance.Column(instance.EntityType.Name+"ID");
instance.GeneratedBy.Native();
}
}

IReferenceConvention:外键引用,外键实体名称+“ID”,可以根据关系同步修改实体

public class DefaultReferenceConvention : IReferenceConvention
{
public void Apply(IManyToOneInstance instance)
{
instance.Column(instance.Name+"ID");
instance.LazyLoad(); }
}

IHasManyConvention:one-to-many实体映射,级联删除等

public class DefaultHasManyConvention : IHasManyConvention
{
public void Apply(IOneToManyCollectionInstance instance)
{
instance.Key.Column(instance.EntityType.Name+"ID");
instance.Cascade.AllDeleteOrphan();
instance.LazyLoad();
}
}

4、fluent nhibernate配置

指定需要映射的程序集并添加自动映射配置

private static AutoPersistenceModel CreateAutomappings()
{
return AutoMap
.Assembly(Assembly.Load("Model"),new DefaultAutomappingConfiguration())
.Conventions.Setup(con =>
{
con.Add<DefaultTableNameConvention>();
con.Add<DefaultPrimaryKeyConvention>();
con.Add<DefaultStringLengthConvention>();
con.Add<DefaultReferenceConvention>();
con.Add<DefaultHasManyConvention>();
});
}

创建session工厂方法:

 public static ISessionFactory CreateSessionFactory()
{
return Fluently
.Configure()
.Database(
MsSqlConfiguration
.MsSql2008
.ConnectionString(c => c.FromConnectionStringWithKey("connstr"))//指定连接字符串
.ShowSql()
)
.Mappings(m => m.AutoMappings.Add(CreateAutomappings())
.ExportTo("c:\\path")//导出映射文件
)
//生成数据库架构
.ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))
.BuildSessionFactory();
}

5、单元测试

生成数据库架构:

保存数据,一对多关系级联保存:

外键修改:

级联删除:

结语:

  开发过程中可以直接添加实体类所在程序集根据自定义重写的规则生成特定映射,一般在项目中经常出现映射文件的问题,可以到处自动映射的文件查看映射字段,在添加映射的时候重写映射解决某个字段映射不正确的问题,初试fluent nhibernate,下班时间比较仓促,代码粗略,也许有很多不合理的地方,欢迎指正交流。

Fluent NHibernate AutoMapping Conventions的更多相关文章

  1. Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...

  2. Fluent NHibernate and Spring.net

    http://blog.bennymichielsen.be/2009/01/04/using-fluent-nhibernate-in-spring-net/ http://comments.gma ...

  3. 【翻译】Fluent NHibernate介绍和入门指南

    英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...

  4. Fluent NHibernate之旅

    Fluent NHibernate 之旅 导航篇: [原创]Fluent NHibernate之旅开篇: [原创]Fluent NHibernate之旅二--Entity Mapping: [原创]F ...

  5. 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)

    在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...

  6. [Fluent NHibernate]第一个程序

    目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...

  7. [Fluent NHibernate]一对多关系处理

    目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...

  8. Fluent NHibernate and Mysql,SQLite,PostgreSQL

    http://codeofrob.com/entries/sqlite-csharp-and-nhibernate.html https://code.google.com/archive/p/csh ...

  9. Fluent NHibernate关系映射

    1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...

随机推荐

  1. centos 7安装jenkins

    1. 安装java yum install java 2. 安装jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci. ...

  2. rsync配置文件的参数详解

    rsyncd.conf配置文件常用参数说明: rsyncd.conf参数 参数说明 uid=rsync rsync使用的用户. gid=rsync rsync使用的用户组(用户所在的组) use ch ...

  3. CMDB配置资源管理数据库(理解)

    CMDB是运维自动化的基础,它为日志系统,发布系统,监控系统等运维系统(ELK,zabbix,open-falcon)提供接口函数, 第一种方式:Agent方法实现,agent不能直接访问数据库,因为 ...

  4. vim+ctags用法

    vim用法     在VIM编辑器的环境下用":make"就可以编译程序,如果程序中有错误,就会显示出来.          下列命令可以快速定位,并修改错误错误 ":c ...

  5. Linux系统在启动过程中内核文件丢失的解决方法

    在/boot目录下有两个重要的文件,分别是: vmlinuz-3.10.0-123.el7.x86_64         内核文件 initamfs-3.10.0-123.el7.x86_64.img ...

  6. 《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息

    注释 像Java开发语言一样,Drools文件中也可以添加注释.注释部分Drools引擎是会将其忽略调的.单行注释使用"//",示例如下: rule "Testing C ...

  7. 怎么样编译DeepMind?

    可以通过下面的文章来编译著名的deepmind系统. How to build DeepMind LabDeepMind Lab uses Bazel as its build system. Its ...

  8. 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...

  9. HAWQ中的行列转置

    行列转置是ETL或报表系统中的常见需求,HAWQ提供的内建函数和过程语言编程功能,使行列转置操作的实现变得更为简单. 一.行转列 1. 固定列数的行转列 原始数据如下: test=# select * ...

  10. 圣诞节为大家推荐一些学习java书籍

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题 初级 ...