<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我為人人,人人為我

    PLM,PDM制造業的制勝法寶
    posts - 16, comments - 9, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    NHibernate總結

    Posted on 2007-09-04 17:29 Glen 閱讀(3288) 評論(0)  編輯  收藏 所屬分類: ORMapping
        項目的框架已經完成,今天把兩個不是很確定的知識點進行學習,并實現例程。但是其中還有一些知識點也只是在項目中實現了,并還沒有去深入的學習。只是把項目中應用的一些經驗總結,以便在我們以后的項目中更好的應用NHibernate 

    1.數據類型對應

           數據庫中以二進制形式存儲的類型,如binaryvarbinanryimage等都可以映射成NHibernateByte數組,c#中也為byte數組,但是要注意大小寫。

           數據庫中以字符串形式存儲的類型,如varcharnvarcharcharntext等可以映射成NHibernate中的String類型,c#中的string類型

           數據庫中的以數字形式存儲的類型,如intfloatdecimal等,對應到相應的數據類型即可。

           數據庫中系統表中的sysname類型對應到string

           Nhibernate中還有BinaryBlobStringClob兩個類型,前者對應到數據庫中的二進制,對應到c#byte數組。后者對應到數據庫中字符串類型,對應到c#中的string。兩者都是用來處理數據長度較大的情況,使用并無特別之處。

           在使用時發現部分數據類型之間的對應關系并不是嚴格限定的,如數據庫中tinyint既可以映射成int類型,也可以映射成Byte,還有ntext可以對應到StringStringClob,靈活性比較大。詳細的對應關系可以參考NHibernate文檔中第四章O/R Mapping基礎中的NHibernate 的類型一節。例子可以參考NHibernate\src\src\NHibernate.Test\TypesTest。注意點Nhibernate是區分大小的,如果有誤是會報錯的。

    2.使用聯合主鍵進行表間映射

           這個知識點好像很難用文字描述清楚,附代碼講解會比較容易理解。

           映射中用到的表      

    table

    person

    Key

    Column

    id

    name

          

    table

    account

    Key

    Column

    account_no

    person_name

    Person_id

    personaccount的關系是一對多,通過person表中idnameaccountPerson_id person_name進行關聯。

    person的映射配置文件為:

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

         <class name="NHibernateTest.Entity.Person,NHibernateTest.Entity" table="person">

             <composite-id>       

                  <key-property name="Id" column="id" type="String"/>

                  <key-property column="name" type="String" name="Name" />

             </composite-id>//聲明聯合主鍵

             <bag name="Accounts" inverse="true" lazy="true">

                  <key>

                       <column name="person_id" />

                       <column name="person_name"/>//聲明關聯的欄位

                  </key >

                  <one-to-many class="NHibernateTest.Entity.Account,NHibernateTest.Entity"/>//聲明一對多關系

             </bag>

         </class>

    </hibernate-mapping>

     

     

    Account表映射配置文件:

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

         <class name="NHibernateTest.Entity.Account,NHibernateTest.Entity" table="account">

              <composite-id>       

                  <key-property column="account_no" type="String" name="AccountNo"/>

                  <key-many-to-one name="OnePerson" class="NHibernateTest.Entity.Person,NHibernateTest.Entity">

                       <column name="person_id"/>

                       <column name="person_name"/>//聲明關聯的欄位

                </key-many-to-one>//聲明多對一關系            

             </composite-id>

    <property column="person_id" type="String" name="PersonId" update="false" insert="false"/>

    <property column="person_name" type="String" name="PersonName" update="false" insert="false"/>  //通過設置updateinsertfalse,聲明屬性為只讀

             <property column="balance" type="Decimal" name="Balance" />

         </class>

    </hibernate-mapping>

     

    注意點:在用到聯合主鍵的實體類中,重寫的Equals方法很重要,在Nhibernate在做數據篩選的時候,會用到Equals方法,如果Equals方法不準確的話,查詢出來的數據是會有問題的。Equals方法設計原則是一定要保證數據的唯一性。Account類中的Equals方法

        

    public override bool Equals( object obj )

         {

             if( this == obj ) return true;

             if( ( obj == null ) || ( obj.GetType() != this.GetType() ) ) return false;

                  Account castObj = (Account)obj;

             return (castObj!=null)&&(this.AccountNo.Equals(castObj.AccountNo)

    &&(this.OnePerson.Id.Equals(castObj.OnePerson.Id)

    &&this.OnePerson.Name.Equals(castObj.OnePerson.Name)));//請注意紅色字體部分

         }

    關于集合之間的對應問題,NHibernate中的baglist可以對應到C#中的List,而因為C#中沒有set這個集合,NHibernate用到第三方的set實現方法,如果需要要set對應必須引用Iesi.Collections.dll

    相關知識點還可以參考nhibernet\src\src\NHibernate.DomainModel下的InnerMiddleOuter,但是這些例子因為沒有數據表對應,所以看起來會比較困難點。

    3.使用同一個連接訪問不同的數據庫(針對sql server

        這個應該算是一個應用的小技巧了,只需要在映射文件的表名前加上庫名就ok,注意下面的代碼的斜體部分。

    <class name="NHibernateTest.Entity.Class,NHibernateTest.Entity" table="DatabaseName.dbo.tablename">


     NHibernate在用到這個映射時會自動訪問相應的database,同時再次訪問項目中配置好的database也不會有問題。同一個連接可以在不同database之間切換。



    做人簡單一點好


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品成人片在线观看精品字幕| 亚洲gv猛男gv无码男同短文| 免费人成大片在线观看播放| 亚洲精品无码乱码成人| 亚欧在线精品免费观看一区| 亚洲国产精品日韩av不卡在线| 毛茸茸bbw亚洲人| 国产精品1024永久免费视频| 香港经典a毛片免费观看看| 亚洲国产精品一区第二页| 最好免费观看韩国+日本| 在线看片免费人成视频久网下载| 日本一区二区在线免费观看 | 蜜桃AV无码免费看永久| 亚洲成a人片在线不卡一二三区 | 亚洲国产精品白丝在线观看| 亚洲国产精品丝袜在线观看| 色老头永久免费网站| 一个人看的免费高清视频日本| 亚洲jizzjizz在线播放久| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | xxx毛茸茸的亚洲| 亚洲情XO亚洲色XO无码| 日本免费人成黄页网观看视频| 国产成人久久AV免费| 黄色毛片免费在线观看| 国产亚洲国产bv网站在线| 国产AV无码专区亚洲AVJULIA| 国产高清在线精品免费软件| 1000部啪啪毛片免费看| a毛片免费播放全部完整| 色天使色婷婷在线影院亚洲| 亚洲午夜精品国产电影在线观看| 亚洲国产a∨无码中文777| 亚洲人成无码www久久久| 超pen个人视频国产免费观看| 久久国产免费福利永久| 日韩成人免费视频| 国产免费一级高清淫曰本片| 污污视频网站免费观看| 婷婷国产偷v国产偷v亚洲|