通過教程二,我們知道如何配置實體與表的對應關係。接下來的教程,就是對象的增刪改查原理以及如何操作實體的增刪改查。
首先,解釋下實體的增刪改查原理,這裡就要引出一個概念:實體狀態,即PersistentState,它表示持久化對象對於操作資料庫的行為。
[Dict("表示持久化對象對於操作資料庫的行為")]
[Serializable]
public enum PersistentState
{
/// <summary>
/// 表示新增一條記錄到資料庫.(預設的狀態).
/// </summary>
[DictEntry("表示新增一條記錄到資料庫(預設的狀態)")]
Added = 0,
/// <summary>
/// 表示修改一條記錄到資料庫.
/// </summary>
[DictEntry("表示修改一條記錄到資料庫")]
Modified = 1,
/// <summary>
/// 刪除,原本未存在於資料庫,稱此狀態為游離狀態.
/// </summary>
[DictEntry("刪除,原本未存在於資料庫,稱此狀態為游離狀態")]
Detached = 2,
/// <summary>
/// 刪除,原本存在於資料庫.
/// </summary>
[DictEntry("刪除,原本存在於資料庫")]
Deleted = 4,
}
這個機制參考了微軟DataRow的行狀態機器制,並且系統自動會調整實體的狀態。
從上面左側的圖片我們可以看出,對於剛執行個體化的實體,它的狀態是屬於新增的,也就是說,此時的資料庫操作應為儲存到資料庫。
儲存完後可以執行以下動作:
1 繼續儲存:有些應用軟體通常情況下點完儲存按鈕後,不會關閉當前視窗,而是繼續修改一些東西,然後再點儲存。此時,系統智能的將實體的狀態改成修改,不需要人為進行什麼操作。
2 關閉當前視窗,重新載入到該實體,然後修改資訊,點儲存;從資料庫載入實體的時候,實體的狀態都是為修改,至於在修改操作的時候會不會被執行,還依賴於一個值(實體從載入出來後到執行儲存之前有沒有被更新過),如果這個值為false,則不會真正的更新操作。這個值就是調用BaseEo.HasChanges方法返回的值。
3 關閉當前視窗,載入到該實體,並刪除。 此時系統進行刪除動作,從資料庫刪除當前的實體,並將實體的狀態改成游離狀態。
ok,我們來看下代碼上如何操作:
// 建立一個針對TestEo實體的資料訪問
BaseDao<TestEo> dao = new BaseDao<TestEo>();
// 執行個體化一個實體
TestEo eo = new TestEo();
eo.A1 = 1;
// 儲存
dao.SaveOrUpdate(eo);
// 載入剛才已儲存過的實體
eo = dao.Load("select * from TestEo where A1="+eo.A1);
eo.A2 = 3M;
// 更新
dao.SaveOrUpdate(eo);
// 載入剛才更新過的實體
eo = dao.Load("select * from TestEo where A1=" + eo.A1);
// 刪除
dao.Delete(eo);
到此為止,我們掌握了如何針對單個實體的增刪改查。
接下來,我們看下如何操作實體集合:EoList。
什麼是實體集合?它有什麼作用?為什麼要引入實體集合?
假設我們遇到這樣一種情境:
就是說,在還沒有點“儲存列設計”按鈕之前,一切的資料都是在記憶體中駐留。雖然新增或者刪除都影響了我們看到的列表資料,但是沒有跟資料庫互動,直到儲存的時候,系統自動對這些資料進行判斷,哪些是應該儲存的,哪些是應該更新的,哪些是應該刪除的。這裡引出了實體狀態的另外一個值:Deleted,該值表示從資料庫的實體,對其進行了刪除標記,在儲存實體集合的時候,進行刪除功能。
實體集合的增刪改跟單條實體的操作,有一個比較不一樣的東西,就是單個實體要刪除的時候,是直接調用Delete方法,而實體集合的操作只有一個方法SaveOrUpdateOrDelete。以下是操作實體集合的調用樣本:
// 建立一個針對TestEo實體的資料訪問
BaseDao<TestEo> dao = new BaseDao<TestEo>();
// 建立一個實體集合容器,該容器裝了3個實體
EoList<TestEo> eoList = new EoList<TestEo>();
eoList.Add(dao.Load("select * from TestEo Where ID=2"));
eoList.Add(dao.Load("select * from TestEo Where ID=3"));
// 對第二個實體進行更新
eoList[1].A2 = 3M;
// 對第一個實體進行刪除,這邊的SetUnavailable方法,就是把實體狀態改成Deleted
eoList[0].SetUnavailable();
// 新增的實體
eoList.Add(new TestEo() { });
dao.SaveOrUpdateOrDelete(eoList);
ok,第二個教程完畢,希望同胞們多去測試,畢竟實踐出真理哈。如果有什麼疑問,可以加入群:222515272
祥億軟體,著作權