新入職一個公司,有一個功能模塊須要修改,看了一個離職同事代碼,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