NHibernate多对多关联映射的实现-创新互联

上次用EF演示了数据库多对多关系的操作,这次我们还是引用上次的案例,来演示如何在C#当中使用NHibernate。

创新互联建站长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为渭源企业提供专业的网站制作、网站设计渭源网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

首先介绍一下NHibernate框架的来源。熟悉Java编程的读者肯定知道Hibernate这个ORM。NHibernate就来源于Java中著名的ORM框架—Hibernate,这点从名称当中就能够知道。目前NHibernate的最新版本是3.3.3,好像有一阵子没有update了,说明当前的版本也比较稳定了。具体的资料可以到官网查询:http://nhforge.org/。

1、下载NHibernate

官网首页就有下载链接,直接下载就可以了。

下载好之后会得到一个zip包。

NHibernate多对多关联映射的实现

我们就地解压可以看到如下目录和文件:

NHibernate多对多关联映射的实现

我们重点关注以下目录的内容:

Configuration_Templates目录:默认提供的一些配置模板。有支持Oracle、Sql Server、MySQL等等。

Required_Bins目录:这里面存放了我们开发时常用的dll文件。其中的两个xsd文件是能够提供智能提示的文件,我们需要将它们俩复制到你本地的VS的Schemas目录下,比如我的目录为:D:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas 。

NHibernate多对多关联映射的实现

复制好之后,重启VS,在我们写Hibernate配置文件时就有了智能提示了。

NHibernate多对多关联映射的实现

准备工作做好之后,我们就可以正式演示。

2、创建一个类库项目Model

我们定义好两个类,分别为Student和Subject,为了便于管理,我们将它们放到Entity文件夹里,但命名空间仍为Model。

namespace Model
{
    public enum Gender { Female, Male }
                                         
    public class Student
    {
        public virtual int? StudentId { get; set; }
        public virtual string StudentName { get; set; }
        public virtual Gender Gender { get; set; }
        public virtual DateTime? BirthDay { get; set; }
                                         
        public virtual IList Subjects { get; set; }
    }
}
namespace Model
{
    public class Subject
    {
        public virtual int? SubjectId { get; set; }
        public virtual string SubjectName { get; set; }
                                       
        public virtual IList Students { get; set; }
    }
}

这是一个典型的多对多的应用场景。一个学生可以选修多个课程,一个课程可以被多个学生选修。

接下来我们再创建相应的Hibernate配置文件(就是普通的xml文件,取名为Student.hbm.xml和Subject.hbm.xml)。

Student.hbm.xml:



  
    
      
    
    
      
    
    
      
    
    
      
    
    
      
      
    
  

Subject.hbm.xml:



  
    
      
    
    
      
    
    
      
      
    
  

便于管理我们同样的放到Config目录下(自己创建的文件夹)。

同时修改两个xml文件的生成操作由内容变为嵌入的资源(在vs中右键xml文件选择属性)

NHibernate多对多关联映射的实现
3、创建一个控制台应用程序

表和实体对应的内容已经定义好,下面关键的就是要写代码来测试NHibernate了,本着尽量降低学习难度的原则,我这里就用控制台应用程序来验证(你也可以新建一个类库项目,然后用VS的单元测试或者第三方测试工具NUnit进行验证)。

首先将下载的开发包里面的Configuration_Templates文件夹下的MSSQL.cfg.xml复制到控制台应用程序中(为方便管理,我新建了一个Config文件夹,并把这个xml文件放到这里面,重命名为hibernate.cfg.xml)。

修改这个xml文件内容为:





  
    NHibernate.Driver.SqlClientDriver
    
      Server=.;database=nhibernateTest;uid=sa;pwd=123456;
    
    10
    true
    update
    NHibernate.Dialect.MsSql2008Dialect
    
  

注意这里面的一些节点的配置。比如mapping assembly里面的Model,就是指的是程序集的名称。同时将此文件的复制到输出目录方式修改为始终复制。

NHibernate多对多关联映射的实现

接下来,给控制台项目添加两个dll的引用,分别为Iesi.Collections.dll和NHibernate.dll,也是在Required_Bins文件夹里面。

添加好引用,我们创建一个新的类NHibernateTest来写关键性代码。

namespace NHibernateDemo
{
    public class NHibernateTest
    {
        private ISessionFactory _sessionFactory;
        public ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    var cfg = new NHibernate.Cfg.Configuration().Configure("Config/hibernate.cfg.xml");
                    _sessionFactory = cfg.BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }
                  
        public void TestInit()
        {
            using (ISession session = SessionFactory.OpenSession())
            {
                IList subjects = new List()
                {
                     new Subject { SubjectName = "数学" },
                     new Subject { SubjectName = "英语" },
                     new Subject { SubjectName = "计算机" },
                };
                  
                IList students = new List()
                {
                    new Student
                    {
                        StudentName = "guwei4037",
                        Gender = Gender.Male,
                        BirthDay = new DateTime(1984, 11, 25),
                        Subjects = subjects.Where(x => x.SubjectName == "数学" || x.SubjectName == "计算机").ToArray(),
                    },
                    new Student
                    {
                        StudentName = "gary.gu",
                        Gender = Gender.Female,
                        BirthDay = new DateTime(1987, 9, 15),
                        Subjects = subjects.Where(x => x.SubjectName == "数学" || x.SubjectName == "英语").ToArray(),
                    },
                };
                  
                ITransaction tran = session.BeginTransaction();
                try
                {
                    foreach (var subject in subjects)
                    {
                        session.Save(subject);
                    }
                  
                    foreach (var student in students)
                    {
                        session.Save(student);
                    }
                  
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
            }
        }
    }
}

这是一个带事务的多表插入的操作。

最后在Main方法中,写入简单的调用方法。

public class program
   {
       public static void Main(string[] args)
       {
           NHibernateTest test = new NHibernateTest();
           test.TestInit();
       }
   }

在运行这个程序之前,还要做一件事,就是要在你的Sql Server中新建一个空的数据库nhibernateTest,否则会提示登录失败。

好了,这时我们已经准备好了一切,让我们运行一下这个控制台应用程序吧。

由于我们在hibernate.cfg.xml文件中定义了输入sql,所以会看到窗口中的内容。

NHibernate多对多关联映射的实现

好,没有报错。我们打开Sql Server看一下最终的结果。

NHibernate多对多关联映射的实现

而且数据库的表、主外键的关联以及数据都为我们自动生成了。

好,双向多对多的关系就演示到这里。如果需要更多详细的信息请参考:http://nhforge.org/doc/nh/en/index.html。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


标题名称:NHibernate多对多关联映射的实现-创新互联
链接URL:http://hbruida.cn/article/ceodii.html