Fluent NHibernate AutoMapping Conventions
前言
使用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的更多相关文章
- Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发
Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...
- Fluent NHibernate and Spring.net
http://blog.bennymichielsen.be/2009/01/04/using-fluent-nhibernate-in-spring-net/ http://comments.gma ...
- 【翻译】Fluent NHibernate介绍和入门指南
英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...
- Fluent NHibernate之旅
Fluent NHibernate 之旅 导航篇: [原创]Fluent NHibernate之旅开篇: [原创]Fluent NHibernate之旅二--Entity Mapping: [原创]F ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- [Fluent NHibernate]第一个程序
目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...
- [Fluent NHibernate]一对多关系处理
目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...
- Fluent NHibernate and Mysql,SQLite,PostgreSQL
http://codeofrob.com/entries/sqlite-csharp-and-nhibernate.html https://code.google.com/archive/p/csh ...
- Fluent NHibernate关系映射
1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...
随机推荐
- MySQL,SqlServer数据库关键字在程序中处理
这个原来是SqlServer的数据库,现在改成MySQL的,由于两个数据库有些差别.在程序中怎么处理.为了给自己提个醒,把它记录下来. 这是MySQL数据库 Public Sub display() ...
- 【javascript基础】运算符优先级
优先级 运算类型 关联性 运算符 1 成员运算符 从左到右 . [] new 从右到左 new 2 函数调用运算符 从左到右 () 3 自增运算符 n/a ++ 自减运算符 n/a -- 4 逻辑非运 ...
- MATLAB基础知识tips
网络论坛资源: MATLAB中文论坛https://i.cnblogs.com/EditPosts.aspx?opt=1 circshift 移位函数,circshift(A,SHIFTSIZE).S ...
- Chrome浏览器优化技巧
Chrome浏览器开发者工具Network窗口下,可以查看下载各组件所需的具体时间 根据上表进行简要分析—— Stalled(阻塞) 浏览器对同一个主机域名的并发连接数有限制,因此如果当前的连接数已经 ...
- 添加operations模块
添加operations模块,models内容为: from django.db import models from datetime import datetime from users.mode ...
- Azure 软件架构选择
1. 传统的分层结构+message broker + worker传统的层结构老生常谈了: UI 层,service,业务逻辑,数据层.就不赘述了与worker形成producer-consumer ...
- 自己总结 C++ 代码规范
.编写原则,代码尽量简单,简洁,高效,自己写的代码让自己和别人容易看懂 .命名: a. 类的成员变量加前缀 m_(表示 member). 常量全用大写的字母,用下划线分割单词(;) 循环变量和简单变量 ...
- 【剑指offer】不用加减乘除做加法,C++实现
原创博文,转载请注明出处! # 题目 # 思路 第一步:不考虑进位对每一位相加(异或操作) 第二步:考虑进位(位与运算+左移) 第三步:第一步和第二步相加(重复执行前两步) # 代码 #include ...
- 【sklearn】性能度量指标之ROC曲线(二分类)
原创博文,转载请注明出处! 1.ROC曲线介绍 ROC曲线适用场景 二分类任务中,positive和negtive同样重要时,适合用ROC曲线评价 ROC曲线的意义 TPR的增长是以FPR的增长为代价 ...
- Ubuntu 16.04安装QQ国际版
QQ国际版wine-qqintl的下载链接:http://pan.baidu.com/s/1jIwKdXs sudo apt install libgtk2.0-0:i386 sudo apt in ...