中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

NHibernate多對多關聯映射的實現

發布時間:2020-08-06 21:43:46 來源:網絡 閱讀:1121 作者:guwei4037 欄目:編程語言

上次用EF演示了數據庫多對多關系的操作,這次我們還是引用上次的案例,來演示如何在C#當中使用NHibernate。

首先介紹一下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<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; }
    }
}

這是一個典型的多對多的應用場景。一個學生可以選修多個課程,一個課程可以被多個學生選修。

接下來我們再創建相應的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目錄下(自己創建的文件夾)。


同時修改兩個xml文件的生成操作由內容變為嵌入的資源(在vs中右鍵xml文件選擇屬性)

NHibernate多對多關聯映射的實現
3、創建一個控制臺應用程序

表和實體對應的內容已經定義好,下面關鍵的就是要寫代碼來測試NHibernate了,本著盡量降低學習難度的原則,我這里就用控制臺應用程序來驗證(你也可以新建一個類庫項目,然后用VS的單元測試或者第三方測試工具NUnit進行驗證)。

首先將下載的開發包里面的Configuration_Templates文件夾下的MSSQL.cfg.xml復制到控制臺應用程序中(為方便管理,我新建了一個Config文件夾,并把這個xml文件放到這里面,重命名為hibernate.cfg.xml)。

修改這個xml文件內容為:

<?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>

注意這里面的一些節點的配置。比如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<Subject> subjects = new List<Subject>()
                {
                     new Subject { SubjectName = "數學" },
                     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 == "數學" || 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。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大石桥市| 屏边| 新巴尔虎左旗| 南阳市| 潮安县| 青川县| 巢湖市| 图片| 玉溪市| 长汀县| 景宁| 绥芬河市| 丹寨县| 民和| 三明市| 甘洛县| 浙江省| 上蔡县| 防城港市| 卓资县| 淮安市| 阳谷县| 贵溪市| 治县。| 平阳县| 镇赉县| 错那县| 雷州市| 榆树市| 天气| 桃园市| 白水县| 南华县| 嵊泗县| 巴青县| 鹤岗市| 龙里县| 海兴县| 常宁市| 白银市| 洪泽县|