前言

  使用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. 【hive】在alter修改元数据的时候报错 mismatched input 'xxxxx' expecting KW_EXCHANGE

    目的:修改表某个字段属性 语句: 报错信息 错误原因: 在HiveQL中,alter命令不使用与create或select相同的语义 ; 具体来说,您不能使用“ALTER DATABASE.TABLE ...

  2. 027——VUE中事件修饰符:stop prevent self capture

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 015——数组(十五)sort natsort shuffle natcasesoft array_multisort

    <?php /*数组排序函数 * sort natsort shuffle natcasesoft array_multisort */ //sort() 对数组元素进行递增的排序, /*$ar ...

  4. Partition 1 does not start on physical sector boundary.分区信息不正常

    [root@v1 ~]# df -h Filesystem      Size  Used Avail Use% Mounted on /dev/sda2        20G  3.3G   16G ...

  5. cx_freeze打包EXE文件

    创建setup.py文件 import osimport sysfrom cx_Freeze import setup, Executable build_exe_options = dict(pac ...

  6. L153

    警言是指传达一般真理或某种言论的短小句子.An aphorism is a short witty sentence which expresses a general truth or commen ...

  7. 设计模式 - 代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  8. IOS开发 多线程编程 - NSOperation

    一.NSOperation 1.简介 NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作. NSOperation本身是抽象基类,因此必须使用 ...

  9. spring boot入门教程——Spring Boot快速入门指南

    Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...

  10. android代码常识

    查看当前android代码版本号:build/core/version_defaults.mk---->查找platform_version android源码在线阅读网址 http://and ...