使用Spring.Net 1.3.2 + NHibernate 3.2的mapping by code和default convention

NH的官网今天出了两篇blog,讲如何使用NH3.2的mapping by code,不过都弱爆了,推荐直接看Fabio Maulo的blog去(

简单的说,NH的mapping by code有三种方式

  • 直接为每个entity类调用ModelMapper.Class方法
  • Conformist映射,也就是class by class
  • Convention,当然约定是可以被explicit mapping所覆盖的

本文展示第二三种混合的方式,也就是使用convention,然后覆盖。

 

首先,使用Convention

NH3.2中,使用Convention的方法也有两种,一种是使用前后置事件,另一种则是使用ModelInspector。后者对DI提供了更好的支持。其中NH内嵌的ConventionModelMapper就是使用了后者,看它的构造函数

 
 
  1: public class ConventionModelMapper : ModelMapper
  2: {
  3:     public ConventionModelMapper()
  4:         : base(new SimpleModelInspector())
  5:     {
  6:         AppendDefaultEvents();
  7:     }
  8: }

其实ModelMapper的构造函数有好几个重载,估计是能实现更强的自定义功能吧,我还没有尝试过。

 

然后,尝试集成进Spring.Net 1.3.2

Spring.Net这货,虽然提供了Spring.Data.NHibernate32.dll,但是其实是把基于NH2.x的代码在结合NH3.2重新build了一遍而已= =

好歹Spring提供了不错的扩展性,自己动手丰衣足食吧~~

 
 
  1:     public class Nh3LocalSessionFactoryObject : LocalSessionFactoryObject
  2:     {
  3:         public IEnumerable<IConformistHoldersProvider> Mappings { get; set; }
  4:         public IModelInspector ModelInspector { get; set; }
  5: 
  6:         protected override void PostProcessMappings(Configuration config)
  7:         {
  8:             base.PostProcessMappings(config);
  9: 
 10:             var mapper = new ModelMapper(ModelInspector);
 11:             foreach (var mapping in Mappings)
 12:             {
 13:                 mapper.AddMapping(mapping);
 14:             }
 15:             var hbmMappings = mapper.CompileMappingForEachExplicitlyAddedEntity();
 16:             foreach (var hbmMapping in hbmMappings)
 17:             {
 18:                 config.AddMapping(hbmMapping);
 19:             }
 20:         }
 21:     }

其中,IConformistHoldersProvider是ClassMapping、SubClassMapping等几个Mapping类共同实现的接口。
ModelInspector的话,我会使用SimpleModelInspector,毕竟这篇文章就是想试试default convention。

 

那么,效果如何呢?

对比EF 4.1的话,有些不同也有些差距。

例如NH3.2默认表名=类名,而EF4.1则默认表名=类名的复数。

再例如EF 4.1中,如果用int做id则默认该id是自增长的,NH3.2中则还是要写代码,我将它写在基类里。

 
 
  1:     public class EntityClassMapping<TEntity> : ClassMapping<TEntity>
  2:         where TEntity : class, IEntity<int>
  3:     {
  4:         public EntityClassMapping()
  5:         {
  6:             Id(e => e.Id, mapper => mapper.Generator(Generators.Identity));
  7:             Table(TableName);
  8:         }
  9: 
 10:         private string TableName
 11:         {
 12:             get { return typeof (TEntity).Name + "s"; }//todo
 13:         }
 14:     }

 

接下来,尝试一下覆盖default convention

例如,给一列重命名,代码如下

 
 
  1:     public class PersonMapping : EntityClassMapping<Person>
  2:     {
  3:         public PersonMapping()
  4:         {
  5:             Property(p => p.IsMale, mapping => mapping.Column("Gender"));
  6:         }
  7:     }

实话实说,我觉得这个API设计的是比较丑陋的。。。对比EF 4.1中实现相同任务的代码

 
 
  1:     public class PersonMapping : EntityMapping<Person>
  2:     {
  3:         public PersonMapping()
  4:         {
  5:             Property(p => p.IsMale).HasColumnName("Gender");
  6:         }
  7:     }

在整个NH3.2的mapping by code API中都充斥满了Action<XXXX>真是让人不胜其烦。

本文就到这里,说的实在是比较简略,不过我也一向没有写科普blog的兴致= =

更多细节还是请参考Fabio Maulo的blog。

 

[Update]出丑了,表名变复数可以使用classCustomizer.Table(Inflector.Pluralize(type.Name)

请参考这篇博文。 

classCustomizer.Table(Inflector.Pluralize(type.Name)

 

转载于:https://www.cnblogs.com/jiaxingseng/archive/2011/09/06/2168429.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值