重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
上次用EF演示了數據庫多對多關系的操作,這次我們還是引用上次的案例,來演示如何在C#當中使用NHibernate。
創新互聯建站長期為數千家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為渭源企業提供專業的網站制作、網站設計,渭源網站改版等技術服務。擁有10多年豐富建站經驗和眾多成功案例,為您定制開發。首先介紹一下NHibernate框架的來源。熟悉Java編程的讀者肯定知道Hibernate這個ORM。NHibernate就來源于Java中著名的ORM框架—Hibernate,這點從名稱當中就能夠知道。目前NHibernate的最新版本是3.3.3,好像有一陣子沒有update了,說明當前的版本也比較穩定了。具體的資料可以到官網查詢:http://nhforge.org/。
1、下載NHibernate
官網首頁就有下載鏈接,直接下載就可以了。
下載好之后會得到一個zip包。
我們就地解壓可以看到如下目錄和文件:
我們重點關注以下目錄的內容:
Configuration_Templates目錄:默認提供的一些配置模板。有支持Oracle、Sql Server、MySQL等等。
Required_Bins目錄:這里面存放了我們開發時常用的dll文件。其中的兩個xsd文件是能夠提供智能提示的文件,我們需要將它們倆復制到你本地的VS的Schemas目錄下,比如我的目錄為:D:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas 。
復制好之后,重啟VS,在我們寫Hibernate配置文件時就有了智能提示了。
準備工作做好之后,我們就可以正式演示。
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 IListSubjects { get; set; } } }
namespace Model { public class Subject { public virtual int? SubjectId { get; set; } public virtual string SubjectName { get; set; } public virtual IListStudents { get; set; } } }
這是一個典型的多對多的應用場景。一個學生可以選修多個課程,一個課程可以被多個學生選修。
接下來我們再創建相應的Hibernate配置文件(就是普通的xml文件,取名為Student.hbm.xml和Subject.hbm.xml)。
Student.hbm.xml:
Subject.hbm.xml:
便于管理我們同樣的放到Config目錄下(自己創建的文件夾)。
同時修改兩個xml文件的生成操作由內容變為嵌入的資源(在vs中右鍵xml文件選擇屬性)
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,就是指的是程序集的名稱。同時將此文件的復制到輸出目錄方式修改為始終復制。
接下來,給控制臺項目添加兩個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()) { IListsubjects = 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,所以會看到窗口中的內容。
好,沒有報錯。我們打開Sql Server看一下最終的結果。
而且數據庫的表、主外鍵的關聯以及數據都為我們自動生成了。
好,雙向多對多的關系就演示到這里。如果需要更多詳細的信息請參考:http://nhforge.org/doc/nh/en/index.html。
創新互聯www.cdcxhl.cn,專業提供香港、美國云服務器,動態BGP最優骨干路由自動選擇,持續穩定高效的網絡助力業務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節活動現已開啟,新人活動云服務器買多久送多久。