XY-ORM 教程三:對象的增刪改查

來源:互聯網
上載者:User

通過教程二,我們知道如何配置實體與表的對應關係。接下來的教程,就是對象的增刪改查原理以及如何操作實體的增刪改查。

首先,解釋下實體的增刪改查原理,這裡就要引出一個概念:實體狀態,即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

 

                                                      祥億軟體,著作權

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.