您好,登錄后才能下訂單哦!
上次用EF演示了數(shù)據(jù)庫多對多關(guān)系的操作,這次我們還是引用上次的案例,來演示如何在C#當中使用NHibernate。
首先介紹一下NHibernate框架的來源。熟悉Java編程的讀者肯定知道Hibernate這個ORM。NHibernate就來源于Java中著名的ORM框架—Hibernate,這點從名稱當中就能夠知道。目前NHibernate的最新版本是3.3.3,好像有一陣子沒有update了,說明當前的版本也比較穩(wěn)定了。具體的資料可以到官網(wǎng)查詢:http://nhforge.org/。
1、下載NHibernate
官網(wǎng)首頁就有下載鏈接,直接下載就可以了。
下載好之后會得到一個zip包。
我們就地解壓可以看到如下目錄和文件:
我們重點關(guān)注以下目錄的內(nèi)容:
Configuration_Templates目錄:默認提供的一些配置模板。有支持Oracle、Sql Server、MySQL等等。
Required_Bins目錄:這里面存放了我們開發(fā)時常用的dll文件。其中的兩個xsd文件是能夠提供智能提示的文件,我們需要將它們倆復制到你本地的VS的Schemas目錄下,比如我的目錄為:D:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas 。
復制好之后,重啟VS,在我們寫Hibernate配置文件時就有了智能提示了。
準備工作做好之后,我們就可以正式演示。
2、創(chuàng)建一個類庫項目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<Subject> Subjects { get; set; } } }
namespace Model { public class Subject { public virtual int? SubjectId { get; set; } public virtual string SubjectName { get; set; } public virtual IList<Student> Students { get; set; } } }
這是一個典型的多對多的應用場景。一個學生可以選修多個課程,一個課程可以被多個學生選修。
接下來我們再創(chuàng)建相應的Hibernate配置文件(就是普通的xml文件,取名為Student.hbm.xml和Subject.hbm.xml)。
Student.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model"> <class name="Student" table="T_Student" lazy="true"> <id name="StudentId" type="int" column="StudentId"> <generator class="native"/> </id> <property name="StudentName" type="string" column="StudentName"> <column name="StudentName" length="50"/> </property> <property name="Gender" type="Gender" column="Gender"> <column name="Gender" length="4"/> </property> <property name="BirthDay" type="datetime" column="BirthDay"> <column name="BirthDay" length="20"/> </property> <bag name="Subjects" table="T_Student_Subject"> <key column="StudentId"/> <many-to-many class="Subject" column="SubjectId"/> </bag> </class> </hibernate-mapping>
Subject.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model"> <class name="Subject" table="T_Subject" lazy="true"> <id name="SubjectId" type="int" column="SubjectId"> <generator class="native"/> </id> <property name="SubjectName" type="string"> <column name="SubjectName" length="50"/> </property> <bag name="Students" table="T_Student_Subject"> <key column="SubjectId"/> <many-to-many class="Student" column="StudentId"/> </bag> </class> </hibernate-mapping>
便于管理我們同樣的放到Config目錄下(自己創(chuàng)建的文件夾)。
同時修改兩個xml文件的生成操作由內(nèi)容變?yōu)榍度氲馁Y源(在vs中右鍵xml文件選擇屬性)
3、創(chuàng)建一個控制臺應用程序
表和實體對應的內(nèi)容已經(jīng)定義好,下面關(guān)鍵的就是要寫代碼來測試NHibernate了,本著盡量降低學習難度的原則,我這里就用控制臺應用程序來驗證(你也可以新建一個類庫項目,然后用VS的單元測試或者第三方測試工具NUnit進行驗證)。
首先將下載的開發(fā)包里面的Configuration_Templates文件夾下的MSSQL.cfg.xml復制到控制臺應用程序中(為方便管理,我新建了一個Config文件夾,并把這個xml文件放到這里面,重命名為hibernate.cfg.xml)。
修改這個xml文件內(nèi)容為:
<?xml version="1.0" encoding="utf-8"?> <!-- This template was written to work with NHibernate.Test. Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it for your own use before compile tests in VisualStudio. --> <!-- This is the System.Data.dll provider for SQL Server --> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <session-factory name="NHibernate.Test"> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="connection.connection_string"> Server=.;database=nhibernateTest;uid=sa;pwd=123456; </property> <property name="adonet.batch_size">10</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <mapping assembly="Model"/> </session-factory> </hibernate-configuration>
注意這里面的一些節(jié)點的配置。比如mapping assembly里面的Model,就是指的是程序集的名稱。同時將此文件的復制到輸出目錄方式修改為始終復制。
接下來,給控制臺項目添加兩個dll的引用,分別為Iesi.Collections.dll和NHibernate.dll,也是在Required_Bins文件夾里面。
添加好引用,我們創(chuàng)建一個新的類NHibernateTest來寫關(guān)鍵性代碼。
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<Subject> subjects = new List<Subject>() { new Subject { SubjectName = "數(shù)學" }, new Subject { SubjectName = "英語" }, new Subject { SubjectName = "計算機" }, }; IList<Student> students = new List<Student>() { new Student { StudentName = "guwei4037", Gender = Gender.Male, BirthDay = new DateTime(1984, 11, 25), Subjects = subjects.Where(x => x.SubjectName == "數(shù)學" || x.SubjectName == "計算機").ToArray(), }, new Student { StudentName = "gary.gu", Gender = Gender.Female, BirthDay = new DateTime(1987, 9, 15), Subjects = subjects.Where(x => x.SubjectName == "數(shù)學" || 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方法中,寫入簡單的調(diào)用方法。
public class program { public static void Main(string[] args) { NHibernateTest test = new NHibernateTest(); test.TestInit(); } }
在運行這個程序之前,還要做一件事,就是要在你的Sql Server中新建一個空的數(shù)據(jù)庫nhibernateTest,否則會提示登錄失敗。
好了,這時我們已經(jīng)準備好了一切,讓我們運行一下這個控制臺應用程序吧。
由于我們在hibernate.cfg.xml文件中定義了輸入sql,所以會看到窗口中的內(nèi)容。
好,沒有報錯。我們打開Sql Server看一下最終的結(jié)果。
而且數(shù)據(jù)庫的表、主外鍵的關(guān)聯(lián)以及數(shù)據(jù)都為我們自動生成了。
好,雙向多對多的關(guān)系就演示到這里。如果需要更多詳細的信息請參考:http://nhforge.org/doc/nh/en/index.html。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。