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框架技术,最后顺利的完成了模块开发。

  • 相关阅读:
    python图像仿射变换实战-提取手写数字图片样本
    详解增强算术赋值:“-=”操作是怎么实现的?
    Pycharm激活码,2020最新Pycharm永久激活码!
    Python爬虫视频教程百度云网盘免费分享
    尚学堂高淇Python400集全套视频教程百度云网盘分享
    Python入门教程哪个好?看看这套怎么样!
    python框架Django实战商城项目之工程搭建
    Python入门书籍电子版PDF百度云网盘免费下载
    廖雪峰老师Python教程及配套视频教程
    manjaro(arch)里的vbox 安装centos7后,centos无法联网的解决办法
  • 原文地址:https://www.cnblogs.com/apsnet/p/2578555.html
Copyright © 2011-2022 走看看