(原创)Nhibernate-对象关系映射的两种方式以及一些注意

       最近一段时间做项目,经理吧权限模块单独提出来,要我开发,熟悉了大概要干的事后,我着手就搭建了一个简单的模块框架。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 IList<Resourse> Resourses { 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框架技术,最后顺利的完成了模块开发。

你可能感兴趣的:(Hibernate)