前言

  昨天写了一篇fluent nhibernate通过约定的代码映射方式,NH在3.0版本以后已经集成了conform的代码映射方式,一直没注意也没使用过,今天试试怎么样。

步骤

1、通过conform方式生成如下数据库架构

2、添加项目对NH3.3的引用,3.0以后已经集成代码映射的方式在using NHibernate.Mapping.ByCode.Conformist;using NHibernate.Mapping.ByCode;命名空间中。

编写持久化对象:

public class Province
{
public Province()
{
Cities = new List<City>();
}
virtual public int Name{get;set;} virtual public int ProvienceID{get;set;} virtual public IList<City> Cities { get; set; }
}
public class City
{
virtual public int CityID{get;set;} virtual public int Name{get;set;} virtual public Province Province { get; set; }
}

集成using NHibernate.Mapping.ByCode.Impl.CustomizersImpl;命名空间下的ClassMapping<T>来实现代码配置持久化对象映射

Provience映射代码:

public class ProvinceMap : ClassMapping<Province>
{
public ProvinceMap()
{
Id(p => p.ProvienceID, map => map.Generator(Generators.Assigned)); Property(p => p.Name); Bag(p => p.Cities, map => map.Key(k => k.Column("ProvinceId")), ce => ce.OneToMany());
}
}

CIty类映射代码:

public class CityMap : ClassMapping<City>
{
public CityMap()
{
Id(p => p.CityID, map => map.Generator(Generators.Assigned));
Property(p => p.Name);
ManyToOne(p => p.Province, map => map.Column("ProvinceId"));
}
}

3、NH配置

首先我们添加一个数据库连接的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="NHConform" connectionString="Data Source=(local);initial catalog=NHConform;Integrated Security=SSPI"/>
</connectionStrings>
</configuration>

编写一个配置NH的类:

public static class NHContext
{
public static Configuration NHConfiguration { get; set; }
public static ISessionFactory SessionFactory { get; set; } public static void AppConfigure()
{
#region NHibernate配置 NHConfiguration = ConfigureNHibernate(); SessionFactory = NHConfiguration.BuildSessionFactory(); #endregion
} private static Configuration ConfigureNHibernate()
{
var configure = new Configuration();
configure.SessionFactoryName("BuildIt"); configure.DataBaseIntegration(db =>
{
//配置数据库连接
db.Dialect<MsSql2008Dialect>();
db.Driver<SqlClientDriver>();
db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
db.IsolationLevel = IsolationLevel.ReadCommitted; db.ConnectionStringName = "NHConform";
db.Timeout = ; db.LogFormattedSql = true;
db.LogSqlInConsole = true;
db.AutoCommentSql = true;
}); var mapping = GetMappings();
//在Configuration中添加HbmMapping
configure.AddDeserializedMapping(mapping, "NHConfORM");
//配置元数据
SchemaMetadataUpdater.QuoteTableAndColumns(configure); return configure;
} public static HbmMapping GetMappings()
{
var mapper = new ModelMapper(); mapper.AddMappings(Assembly.GetAssembly(typeof(ProvinceMap)).GetExportedTypes());
var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities(); return mapping;
}
}

4、测试映射配置生成数据库架构,建了一个控制台程序没有写单元测试,生成数据库架构的代码

public static void Create()
{
NHContext.AppConfigure();
new SchemaExport(NHContext.NHConfiguration).Create(false, true);
}

在控制台主程序中执行Create()方法,生成数据库并生成如上图的数据库关系图。

测试删除数据库:

public static void Drop()
{
NHContext.AppConfigure();
new SchemaExport(NHContext.NHConfiguration).Drop(false, true);
}

执行Drop()方法以后数据库结构就被删除了,此处就不截图了。

结语

  NH自带的代码映射方式同样支持编写规则映射,这样在项目中会节约很多的时间,相比直接感觉还是用这个比较直接了,毕竟不需要引入第三方类库。

此映射方式初次使用,若有不合理的地方,欢迎批评指正。

NHibernate ConfORM Mapping的更多相关文章

  1. SQLSERVER2012 列存储索引的简单研究和测试

    SQLSERVER2012 列存储索引的简单研究和测试 SQLSERVER2012 列存储索引的简单研究和测试 看这篇文章之前可以先看一下下面这两篇文章: 列存储索引 http://www.cnblo ...

  2. NHibernate3剖析:Mapping篇之ConfORM实战(1):概览

    ORuM思想浮出 对于ORM(Object Relational Mapping)我们太熟悉了,可是我们从还有一个角度能够想象出ORuM(Object Relational un-Mapping)的思 ...

  3. NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)

    摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...

  4. 【翻译】首个基于NHibernate的应用程序

    首个基于NHibernate的应用程序  Your first NHibernate based application 英文原文地址:http://www.nhforge.org/wikis/how ...

  5. 跟我学 NHibernate (三)

    在使用 NHibernate 时,一定要将Mapping 映射文件,也就是 xml 文件的编译方式设置成 嵌入式,这是因为在 NHibernate 启动时,它会主动的到项目的启动目录中寻找 被设置为嵌 ...

  6. MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many)

    MyGeneration的几个NHibernate模板功能已经很强,但还是存在些问题.例如:Guid主键支持不佳,代码不易修改,不支持中文注释等等.所以我决定自己来改写此模版.我把一部分通用的函数提取 ...

  7. 用MyGeneration模板生成NHibernate映射文件和关系

    用我的MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many) MyGeneration的几个NHibernate模 ...

  8. ASP.NET MVC NHibernate 整合

    请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...

  9. NHibernate官方文档中文版--ISessionFactory的配置(ISessionFactory Configuration)

    由于NHibernate是被设计应用在许多不同环境中的,因此它存在很多配置参数.幸运的是,这些参数大多都有合理的默认值,而且NHibernate发布的时候伴随着一个App.config 例子(可在sr ...

随机推荐

  1. linux下如何退出tmux和重新进入tmux

    1.退出(detach)当前tmux ctrl+d 2.重新进入tmux tmux attach -t <target-session> 如:当前有很多session,那么选择哪一个呢? ...

  2. [BZOJ2117]Crash的旅游计划

    Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Crash和陶陶所要去的城市里有N (N > 1) 个景点,Cra ...

  3. Eclipse插件Fat Jar

    1.安装 1)Eclipse在线更新方法 Help > Install New Software > Add, name:Fat Jar location:http://kurucz-gr ...

  4. Mac OS 下安装 Vagrant

    Vagrant是一款用来构建虚拟开发环境的工具,它其实算是一个跨平台的虚拟机管理工具 1 安装 1.1 安装Vagrant 下载好pkg文件后,下一步安装即可 1.2 安装Virtualbox Vag ...

  5. Angular4笔记——表单状态相关的属性

    表单状态字段(FromControl)touched和untouched用来判断用户是否访问过一个字段(也就是这个字段是否获取过焦点,如果获取过焦点,touched是true,untouched是fa ...

  6. 微信分享签名Java代码实现

    最近写了一个小微信签名功能,记录一下希望用到的朋友可以参考下. RestController @RequestMapping("/api/wx") public class Wei ...

  7. wpf 中关于Image中样式Style的一点总结

    第一种写法: (1):定义样式 <Style x:Key="imgStyle" TargetType="Image">  : <!-- Tar ...

  8. 【Demo】CSS3 动画文字

    效果图: 完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  9. Leetcode 53

    //经典class Solution { public: int maxSubArray(vector<int>& nums) { ; int maxsum = -INT_MAX; ...

  10. Uedit个人专注

    Uedit个人专注   Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\Shell\Uedit] [HKEY_CLASSES_ROO ...