前言

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

步骤

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

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

编写持久化对象:

  1. public class Province
  2. {
  3. public Province()
  4. {
  5. Cities = new List<City>();
  6. }
  7. virtual public int Name{get;set;}
  8.  
  9. virtual public int ProvienceID{get;set;}
  10.  
  11. virtual public IList<City> Cities { get; set; }
  12. }
  13. public class City
  14. {
  15. virtual public int CityID{get;set;}
  16.  
  17. virtual public int Name{get;set;}
  18.  
  19. virtual public Province Province { get; set; }
  20. }

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

Provience映射代码:

  1. public class ProvinceMap : ClassMapping<Province>
  2. {
  3. public ProvinceMap()
  4. {
  5. Id(p => p.ProvienceID, map => map.Generator(Generators.Assigned));
  6.  
  7. Property(p => p.Name);
  8.  
  9. Bag(p => p.Cities, map => map.Key(k => k.Column("ProvinceId")), ce => ce.OneToMany());
  10. }
  11. }

CIty类映射代码:

  1. public class CityMap : ClassMapping<City>
  2. {
  3. public CityMap()
  4. {
  5. Id(p => p.CityID, map => map.Generator(Generators.Assigned));
  6. Property(p => p.Name);
  7. ManyToOne(p => p.Province, map => map.Column("ProvinceId"));
  8. }
  9. }

3、NH配置

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

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

编写一个配置NH的类:

  1. public static class NHContext
  2. {
  3. public static Configuration NHConfiguration { get; set; }
  4. public static ISessionFactory SessionFactory { get; set; }
  5.  
  6. public static void AppConfigure()
  7. {
  8. #region NHibernate配置
  9.  
  10. NHConfiguration = ConfigureNHibernate();
  11.  
  12. SessionFactory = NHConfiguration.BuildSessionFactory();
  13.  
  14. #endregion
  15. }
  16.  
  17. private static Configuration ConfigureNHibernate()
  18. {
  19. var configure = new Configuration();
  20. configure.SessionFactoryName("BuildIt");
  21.  
  22. configure.DataBaseIntegration(db =>
  23. {
  24. //配置数据库连接
  25. db.Dialect<MsSql2008Dialect>();
  26. db.Driver<SqlClientDriver>();
  27. db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
  28. db.IsolationLevel = IsolationLevel.ReadCommitted;
  29.  
  30. db.ConnectionStringName = "NHConform";
  31. db.Timeout = ;
  32.  
  33. db.LogFormattedSql = true;
  34. db.LogSqlInConsole = true;
  35. db.AutoCommentSql = true;
  36. });
  37.  
  38. var mapping = GetMappings();
  39. //在Configuration中添加HbmMapping
  40. configure.AddDeserializedMapping(mapping, "NHConfORM");
  41. //配置元数据
  42. SchemaMetadataUpdater.QuoteTableAndColumns(configure);
  43.  
  44. return configure;
  45. }
  46.  
  47. public static HbmMapping GetMappings()
  48. {
  49. var mapper = new ModelMapper();
  50.  
  51. mapper.AddMappings(Assembly.GetAssembly(typeof(ProvinceMap)).GetExportedTypes());
  52. var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
  53.  
  54. return mapping;
  55. }
  56. }

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

  1. public static void Create()
  2. {
  3. NHContext.AppConfigure();
  4. new SchemaExport(NHContext.NHConfiguration).Create(false, true);
  5. }

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

测试删除数据库:

  1. public static void Drop()
  2. {
  3. NHContext.AppConfigure();
  4. new SchemaExport(NHContext.NHConfiguration).Drop(false, true);
  5. }

执行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. STRIDE 和 DREAD

    目录 STRIDE 和 DREAD 背景 STRIDE DREAD 注释 STRIDE 和 DREAD 背景 STRIDE 和 DREAD 是最常用也是最好用的安全模型 STRIDE 主要负责对安全风 ...

  2. CodeForces 838A Binary Blocks(前缀和)题解

    题意:给你个n*m的矩阵,要求你找到一个k,k > 1,使得矩阵可以分为很多k * k的小正方形,然后进行操作把每个小正方形都变为0或1,问你怎样使操作数最小. 思路:随便暴力不可取,显然你每次 ...

  3. 日志自定义Tag

    import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentHashMap; /** * Crea ...

  4. 【日志】修改redis日志路径

    redis默认不记录log文件,需要在Redis.conf文件,找到loglevel notice,在其后的logfile "",双引号中,写redis的路径"/redi ...

  5. fiddler几种功能强大的用法(二)

    参考网址:http://blog.rekfan.com/articles/228.html http://www.cnblogs.com/tugenhua0707/p/4637771.html htt ...

  6. SQL优化:清理生产环境中已失效字段基本步骤

    1.统计相应字段的数据情况(如:几年没更新,无数据等情况) 2.确认产品逻辑已无效(产品经理邮件确认) 3.数据备份 4.将数据清空(置为0或空) 5.测试环境中删除引用页面 6.修改定时程序,存储过 ...

  7. C# 后台模块 Word 模板操作

    public static string CreateWord() { //********************************************** //来自博客http://bl ...

  8. Flutter基础Widget之按钮(RaisedButton、FlatButton、OutlineButton,IconButton)

    Flutter中给我们预先定义好了一些按钮控件给我们用,常用的按钮如下 RaisedButton :凸起的按钮,其实就是Android中的Material Design风格的Button ,继承自Ma ...

  9. Linux下,EPM11.1.1.3 configurator 不能启动AdminServer

    需要测试环境, 安装EPM11.1.1.3 到 CentOS 5.6 在运行configurator(/app/hyperion/common/config/9.5.0.0 时, 卡在[Startin ...

  10. HTML5-canvas实例:2D折线数据图与2D扇形图

    基础知识: <canvas id="demo" width="400" height="400"></canvas> ...