最近一段时间做项目,经理吧权限模块单独提出来,要我开发,熟悉了大概要干的事后,我着手就搭建了一个简单的模块框架。BLL层+Dao层+Model层+UI层。整个项目,采用Nhibernate3.0框架技术实现。
应为业务功能不是很多,Dao层就负责访问数据库,BLL本来是业务层,但是没有什么复杂业务,所以也就是一些增删改查,然后Model层是参照分析得出的对象关系,这里大家都知道。既然采用Nhibernate,就的利用起来,然后开始建立了对象之间关系的映射,一堆xml文件,后来发现可以在实体里面直接建立映射,这里是利用了Nhibernate.mapping.Attributes的扩展实现,类似于这种:
1 [Property(Name = "AuthorityName", NotNull = true)]2 public virtual string AuthorityName { get; set; } //权限名称3 4 [Bag(0, Table = "AuthorityResourse", Lazy = CollectionLazy.True)]5 [Key(1, Column = "AuthorityId", ForeignKey = "FK_AuthorityResourse_Authority")]6 [Index(2, Column = "ar_index")]7 [ManyToMany(3, Class = "SEC.Model.Resourse", Column = "ResourseId", ForeignKey = "FK_AuthorityResourse_Resourse")]8 public virtual IListResourses { get; set; } //一个权限下操作多个资源
这里要注意的一点就是,多个特性映射需要加上index位置,否则会有些Bug,比如你电脑没问题,别人用你的文件就会出现一些Bug.实体映射配置好以后,我们可以利用工具反向生成数据库表,这里要提到的是,如果用xml配置方式,我们采用工具生成数据的方式要简单点,应该如下:
View Code
1 //添加引用using Nhibernate.Tool.hbm2ddl;2 3 var nhConfig = new Configuration().Configure();//得到配置文件4 5 var schemaScript = new SchemaExport(nhConfig);6 schemaScript.Drop(false, true);7 schemaScript.Create(false, true);8 schemaScript.SetOutputFile(@"db.sql").Execute(false, false, false);
而如果采用特性配置的方式,因为配置信息在实体类,我们必须把它加载到输入流当中才能得到实体映射关系,代码应该如下所示:
View Code
1 var nhConfig = new Configuration().Configure(); 2 var serializer = NHibernate.Mapping.Attributes.HbmSerializer.Default; 3 nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Entity))); 4 nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.User))); 5 nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Role))); 6 nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Group))); 7 nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Resourse))); 8 nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Authority))); 9 var schemaScript = new SchemaExport(nhConfig);10 schemaScript.Drop(false, true);11 schemaScript.Create(false, true);12 schemaScript.SetOutputFile(@"db.sql").Execute(false, false, false);
这样我们就能正确生成我们的数据库。Dao层我们利用Nhibernate提供的session和事务机制完成对数据库的访问,UI层采用MVC2框架技术,最后顺利的完成了模块开发。