程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Nibernate映射配置,簡單記法,配置說明。

Nibernate映射配置,簡單記法,配置說明。

編輯:C#入門知識

學時主要是看的博客和文檔

博客地址 http://www.cnblogs.com/GoodHelper/archive/2011/02/14/nhiberante_01.html 本文中部分代碼和圖便是從這裡復制過來的。

 

說出來有點丟人,一直只是會照貓畫虎的配,理解總是差了一線,但想找到再一次瞪眼過程中,終於把那一線過了,再之後就不用記什麼,閉著眼都能配了。

這裡用文字,顏色,少量的文檔說明,結合實例,解析每種配置實例。

相信對剛學習hibernate的同學會有幫助。

 

總結如下

基本映射就不多說了 屬性生成器搞定,主鍵必要時再查,聯合主鍵很少會用到。

PS 大學學數據庫是學過外鍵的,但.NET的培訓和我幾個上司的建議是不用外鍵,不過必要的時候我還是加了點……還加了級聯和觸發器

因為很少用,剛開始接觸hibernate,外鍵一段時間還比較暈,可能有和我一樣暈的

這裡補充

舉例

stuent是外鍵表,class是主鍵表

public class Class
{
public virtual int? ID { get; set; }

public virtual string Name { get; set; }
}

public class Student
{
public virtual int? ID { get; set; }

public virtual string Name { get; set; }

public virtual Class Class { get; set; }
}

name屬性名,class主鍵表對應的類,colum外鍵表的外鍵,property_ref 外鍵表的外鍵對應類的屬性,默認為主鍵。

閉著眼睛寫

映射關系為 :本類型的屬性 ,對應的類型為,對應關系,本類型(Student)對應的表(student)的外鍵字段類的主鍵屬性。

<class name="">

<many-to-one name=""  class="" column="" property-ref=""/>

</class>

這是

默認值可以簡寫為

 <many-to-one name="Class" column="ClassID"/>

簡寫是因為有默認值

class(可選 - ): 關聯的類的名字,反射可以找到對應的類型

: (可選) 指定關聯類的一個屬性,這個屬性將會和本外鍵相對應。 如果沒有指定,會使用對方關聯類的主鍵。 就是說。

 

下面是文檔的原話

property-ref屬性只應該用來對付老舊的數據庫系統, 可能有外鍵指向對方關聯表的是個非主鍵字段(但是應該是一個惟一關鍵字)的情況下。 這是一種十分丑陋的關系模型。比如說,假設Product類有一個惟一的序列號, 它並不是主鍵。(unique屬性控制NHibernate通過SchemaExport工具生成DDL的過程。) 

 

還是之前的關系圖,與多對一對應

public class Student
    {
        public virtual int? ID { get; set; }

        public virtual string Name { get; set; }
    }

    public class Class
    {
        public virtual int?  { get; set; }

        public virtual string Name { get; set; }

        public virtual IList<>  { get; set; }
    }

一個班級可能有多個學生,學生是個集合ILIST

本類型()的主鍵——m  一對多的集合(IList<Student>)裡每個元素()所對應表()的外鍵()

 <class name="" table="T_Class" lazy="true" >
    <id name="" type="int" column="ClassID">  這個ClassID只是配置Class類的主鍵
      <generator class="native"/>
    </id>

 <bag name="">
      <key column=""/>  這個ClassID實際是指類對應的Student表的字段。
      <one-to-many class=""/>
    </bag>

</class>

 

 

一、單向主鍵關聯映射 

這種關系關聯配置上沒什麼新東西,主要是主鍵的配置

主鍵關聯不需要額外的表字段;如果兩行是通過這種一對一關系相關聯的,那麼這兩行就共享同樣的主關鍵字值。所以如果你希望兩個對象通過主鍵一對一關聯,你必須確認它們被賦予同樣的標識值!

<class name="" table="PERSON">
    <id name="Id" column="PERSON_ID">
        <generator class="foreign">
            <param name="property">Employee</param>  ,主鍵值 配置為通過外鍵查詢,Person的主鍵值=Exmloyee類的主鍵值
        </generator>
    </id>
    ...
    <one-to-one name=""
        class="Employee"
        constrained="true"/>  映射關系:無視上面的主鍵配置,這節的意思是,的主鍵Id=屬性的主鍵,one-to-one 也有-ref這項,如果是主鍵則可省,唯一主外鍵一對一映射就設置了這項。 
</class>

上面為單向一對一。

雙向只要在Employee類裡加Person屬性,映射裡添

<one-to-one name="Person" class="Person"/>

就OK了,Emplyee的主鍵ID=Employee類中Person屬性的ID。

<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true"/> 也可以實現相同的效果,表示是一對一,column="PERSON_ID"表示是Employee的PERSON_ID 對應的Person類的主鍵。

唯一外鍵關聯映射

單向。

<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true"/>

如果在Person的映射加入下面幾句,這種關聯就是雙向的:

<one-to-one name="Employee" class="Employee" property-ref="Person"/>
Person類主鍵ID=Employee類的Person屬性的主鍵ID


而下面這種直接配置多對多關系,在EF對映的是隱式的多對多。

懂單向的多對多,雙向的也是一個道理
多對多,關系,主動配置的一方,默認為ID屬性(表的主鍵)。

T_User的主鍵ID()=的,的=表的主鍵ID(RoleID)
 <many-to-many class="Role" column="RoleID"/> 與上面的類似

//這個ROLE,默認關聯ROLE的ID(主鍵)
之前的某些配軒,是主鍵則可以省略不寫,不是主鍵則添加 property-ref配置,不過這個我沒試過。
<class name="" table="T_User" lazy="true" >
    <id name="ID" type="int" column=""> 這是User類配置的主鍵,與下面的關系配置無關,煙霧彈。
      <generator class="native"/>
    </id>

    <bag name="Roles" table="">
      <key column=""/>
      <many-to-many class="" column=""/>
    </bag>
    
  </class>


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved