.net使用NHibernate設置一對多、多對一關係

新入職一個公司,有一個功能模塊須要修改,看了一個離職同事代碼,orm使用的是NHibernate,自己對EF還有NHibernate知道的不是不少,用的也不深。看到映射關係很頭疼,實體類中嵌套各類實體類,不知道爲何,查了資料才知道,主要爲了一對多、多對一的關係。下面是找的資料,讓我明白了一些。html

1.Fluent NHibernate讓你再也不須要去寫NHibernate的標準映射文件(.hbm.xml), 方便了咱們的代碼重構,提供了代碼的易讀性,並精簡了項目代碼數據庫

實現:spa

(1)、首先咱們經過nuget包管理器添加FluentNHibernate與NHibernate的引用。orm

(2)、編寫實體類,注意實體的屬性都是virtual//由於沒使用過,可是來到公司之後才知道,不添加virtual操做實體類保存數據庫會報錯xml

(3)、實體類編寫完成之後咱們用代碼的方式實現對實體的映射htm

2.定義支持的關聯屬性對象

Cascade 指該對象在進行操做時關聯到的子對象的操做類型blog

PropertyRef屬性通常用來解決遺留數據庫一對多關係的問題ip

PropertyRef被關聯到此外鍵的類中的對應屬性的名字,若沒指定,使用被關聯類的主鍵.get

PropertyRef不是數據庫表中的字段名,而是定義的類中的屬性名

3. 一對多HasMany<>() / 多對一 References<>()

3.1. 定義支持的關聯屬性

KeyColumn  表示主鍵名

Cascade表示級聯取值,決定是否把對對象的改動反映到數據庫中,因此Cascade對全部的關聯關係都起做用, Cascade是操做上的連鎖反映,Cascade取值多是如下:

AllDeleteOrphan       在關聯對象失去宿主(解除父子關係)時,自動刪除不屬於父對象的子對象, 也支持級聯刪除和級聯保存更新.

DeleteOrphan           刪除全部和當前對象解除關聯關係的對象        

All                 級聯刪除, 級聯更新,但解除父子關係時不會自動刪除子對象.

Delete                                  級聯刪除, 但不具有級聯保存和更新

None                                     全部操做均不進行級聯操做

SaveUpdate                        級聯保存(load之後若是子對象發生了更新,也會級聯更新). 在執行save/update/saveOrUpdate時進行關聯操做,它不會級聯刪除

Inverse()    所描述的是對象之間關聯關係的維護方式,做用是:是否將對集合對象的修改反映到數據庫中。Inverse表示對集合對象的修改會被反映到數據庫中;爲了維持兩個實體類(表)的關係,而添加的一些屬性,該屬性可能在兩個實體類(表)或者在一個獨立的表裏面,這個要看這雙方直接的對應關係了: 這裏的維護指的是當主控方進行增刪改查操做時,會同時對關聯關係進行對應的更新,Inverse是操做上的連鎖反映。

NotFound   指定外鍵引用的數據不存在時如何處理: ignore會將數據不存在做爲關聯到一個空對象(null)處理。

用戶表

public UserMap() 

    Table("Users"); 
    Id(u => u.UserID).GeneratedBy.Identity() ; 
    Map(u => u.UserName); 
    Map(u => u.Password); 
    Map(u => u.CreateTime); 
    //一對一映射用戶和用戶信息表
    HasOne<UserDetail>(u => u.Detail).Cascade.All().Fetch.Select(); 
    //處理一對多關係的映射,一個User能夠有多個訂單,關聯的數據表進行延遲加載,主鍵名爲UserID,級聯關係全部操做
    HasMany<Order>(u => u.Orders).Cascade.All().Inverse().KeyColumn("UserID")LazyLoad(); 
}

訂單表

public OrderMap() 

    Table("Orders"); 
    Id(o => o.OrderID).GeneratedBy.Identity(); 
    Map(o => o.Price); 
    Map(o => o.State).CustomType<OrderState>(); 
    Map(o => o.Address); 
    Map(o => o.Coignee); 
    Map(o => o.CreateTime); 
    Map(o => o.Zip); 
    //處理多對一關係,多個Order能夠屬於一個User
    References<User>(o => o.User).Column("UserID").Not.LazyLoad().Not.Insert().Not.Update();  

注意:  關聯的數據表進行懶加載,主鍵名爲UserID,級聯關係全部操做,cascade:All|delete|saveorUpdate,級聯刪除時需加上Inverse()

什麼是級聯更新?什麼是級聯刪除?

A :父表(外鍵對應的主鍵表) B:引用表(定義外鍵的表)
B與A 作級聯更新 當 A 表數據修改時,B表相應數據也跟着修改
B與A 作級聯刪除 當 A 表數據刪除時,B表相應數據也跟着刪除

附上連接,想看完整的這個地址:https://www.cnblogs.com/shy1766IT/p/4855176.html

相關文章
相關標籤/搜索