NHibernate實戰詳解(一)領域模型設計

2021-06-19 22:57:01 字數 3965 閱讀 7956

關於nhibernate的資料本身就不多,中文的就更少了,好在有一些翻譯文章含金量很高,另外nhibernate與hibernate的使用方式可謂神似,所以也有不少經驗可以去參考hibernate。

本文是實戰中的心得,也是nhibernate高階教程,假設你已經看過nhibernate的文件,但對它還是覺得無法駕馭,那麼你可以看看本文,或者你只是想看看其他人在實戰中是如何使用它的,你也可以看看。

所以,本文提到的內容絕對是乾貨。

需求簡述:

簡單地描述一下,有乙個批次,乙個批次包含多個訂單,每個訂單又可以有3個任務步驟要處理。

有時候我們需要獲取乙個批次,然後對這個批次下所有訂單進行處理,也可能會涉及到訂單的任務(資料庫中可能涉及到3張有關聯的表);

有時候我們也會獲取乙個訂單,然後看這個訂單屬於哪個批次,還有就是對這個訂單的任務步驟進行操作;

有時候我們會有相對複雜的查詢,比如說要顯示到第二個任務步驟的訂單,並且第乙個任務步驟已經完成,然後還需要根據訂單中的日期進行過濾;

業務規則:

乙個批次可以有多個訂單,訂單號不能重複;

乙個訂單有3個任務步驟,而且是三種不同型別的任務步驟;

也就是說如果我們獲取了乙個批次物件,它可能包含了40個訂單,每個訂單最多有4種任務型別,但轉換成資料庫sql查詢語句可能會返回最多160條記錄。

關注領域模型,以領域模型為中心

圖1-1 領域模型圖

上圖可以看出三個領域模型之間都存在著密切的關係。

批次類,批次被建立的時候(也就是new例項化的時候),它的建立時間(createdate)就是系統預設時間,

然後他有乙個名字(name),並且它依賴了乙個集合(訂單集合),和一些方法,一些操作訂單的方法。

你會發現我這裡使用的是isei類庫,大家都知道這個是表示這個集合不能重複的。

另外一些操作訂單的方法裡都會有一句「order.purchasetime = null

;」或者"order.purchasetime = this

;",這表示我們在批次中新增訂單的同時,讓訂單物件也關聯到批次,讓訂單物件可以感知到批次的存在,這一點非常重要。

public

class

purchasetime : domainbase

/// public

virtual

string

name

private icollection_purchaseorders = new iesi.collections.generic.hashedset();

public

virtual icollectionpurchaseorders

set }

public

virtual

void

clearorders()

this

._purchaseorders.clear();

}public

virtual

void

addorder(purchaseorder order)

public

virtual

void

removeorder(purchaseorder order)

}

訂單類,這個訂單的業務邏輯已經被我砍掉很多了,只保留一些我們要討論的內容,本來它的內容相當豐富。

可以看到頂到依賴乙個批次物件,並且可以擁有任務集合。

意思是看一下該訂單的任務集合中是不是有相同的任務物件存在,這裡非常有意思,通常比較兩個物件是否相等.net會從記憶體中去比較他們是不是同乙個物件,而使用nhibernate的話我們可能會希望他們的id屬性是不是同乙個來判斷他們是否相等,所以我們一般會涉及乙個所有領域模型的基類,來重寫equals和gethashcode方法。

但是我們上面的需求提到驗證任務型別存不存在,所以我們關心的不是id相不相等,而是型別(takstype)相不相等,後面會提到如何重寫equals和gethashcode方法。

這個領域模型的設計已經給後面的設計打下了重要的基礎,為什麼我們不寫儲存過程,或者是再查詢一次資料庫來驗證是否存在或者什麼的。

public

class

purchaseorder : domainbase

//////

交貨日期

/// public

virtual datetime?dateofdelivery

private purchasetime _purchasetime = new

purchasetime();

public

virtual

purchasetime purchasetime

set }

private icollection_purchasetasks = new hashedset();

public

virtual icollectionpurchasetasks

set }

//////

指派任務

/// ///

public

virtual

void

else

}if (task.principal != 0

)

}public

virtual

void

cleartask()

_purchasetasks.clear();

}public

virtual

void

removetask(purchasetask task)

public

virtual

bool

containstask(purchasetask task)

//////

任務進度

///0未開始

///1完成

///2完成

///3完成

/// public

virtual

decimal?taskprogress

}

任務類,在這個類的最後我們已經看到override比較物件相等的方法了。

public

class

purchasetask : domainbase

set

}

//////

任務型別

///型別1 型別2 型別3

/// public

virtual

decimal?tasktype

//////

任務負責人id

/// public

virtual

decimal?principal

//////

是否處理

/// ///

public

virtual

bool

ifhandle()

return

false

; }

//////

獲取需要處理的進度步驟

/// ///

///public

virtual

decimal? getneedhandleprogress(decimal?tasktype)

}public

override

bool equals(object

obj)

public

override

intgethashcode()

}

SQLAlchemy實戰詳解

感謝朋友支援本部落格,歡迎共同 交流,由於能力和時間有限,錯誤之處在所難免,歡迎指正!better me的部落格 blog.csdn.net tantexian 簡單查詢 print session.query user all print session.query user.name,user....

Unity實戰 詳解換裝系統 一

個人認為,新手 例如我 學習換裝系統難免會有障礙,因為換裝系統涉及到一些關於模型的知識,而之前都很少涉及到,於是就掉坑了。所以先普及一下一些基礎知識。mesh 網格 模型的外形 網格檔案 網格 bone 骨架 在unity中表現為transform 展開我們的模型會發現有一堆只有transform元...

原 Nhibernate一些筆記

一 nhibernate五部曲 1 在資料庫中建立.net類持久化的對應表 建資料庫 2 建立需要持久化的.net類 編寫model類 4 建立nh的配置檔案,告訴nh怎麼樣連線資料庫 nhibernate.cfg.xml 5 使用nh提供的api create delete update 二 nh...