zoukankan      html  css  js  c++  java
  • (原创)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框架技术,最后顺利的完成了模块开发。

  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/apsnet/p/2578555.html
Copyright © 2011-2022 走看看