前言

  使用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. 【zznu-2060】 Minsum Plus(最小正子段和)

    题目描述 题意简单到令人发指! 序列A由N个整数组成,从中选出一个连续的子序列,使得这个子序列的和为正数,且和为所有和大于零的子序列中的最小值. 将这个值输出,若无解,输出no solution. 输 ...

  2. 转载:【Oracle 集群】RAC知识图文详细教程(五)--特殊问题和实战经验

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  3. AES前后端加密

    1.前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  4. @Transactional的readOnly、timeout

    1.@Transactional的readOnly 在使用@Transactional注解的时候,有一个属性是readOnly,默认值是false readOnly的意思就是当前的方法是只读的,也就是 ...

  5. python项目中requirements的巧用(一键导入所有安装包)

    一个Python 项目中可能安装很多安装包, 再次创建虚拟环境是需要重新安装的话很麻烦也费时间, 或者项目部署的时候避免重装, 可以将现有项目的所有安装包记录在requirements.txt 文件, ...

  6. JSP里的<c:if>不起作用[待解答]

    JSP页面的部分代码如下: 下面的title作为请求参数,shoppingCart作为session范围域的属性. 问题1: 如果去掉<c:if>的判断条件,第一行打印:可以正常显示出来, ...

  7. jQuery 选择器效率

    http://blog.csdn.net/cxl444905143/article/details/48808809 ID > Tag > Class ID 选择器是速度最快的,这主要是因 ...

  8. 【PL/SQL编程】变量和常量

    1. 变量格式 <变量名><数据类型>[(长度):=<初始值>]; v_countryname varchar2(50):='中国'; 2. 常量格式 <常量 ...

  9. widow系统 LuaForWindows,安装 luasocket

    参考 http://94it.net/a/jingxuanboke/2013/0625/49052.html 1. 我用的是 LuaForWindows_v5.1.4-46.exe 可以在我的百度网盘 ...

  10. NSStringFromSelector(_cmd)和self

    1._cmd是隐藏的参数,代表当前方法的selector,他和self一样都是每个方法调用时都会传入的参数,动态运行时会提及如何传的这两个参数, 你在方法里加入CCLOG(@\"%@, %@ ...