iT邦幫忙

DAY 20
3

OpenAccess ORM for Oracle 實戰演練系列 第 16

OpenAccess ORM for Oracle 實戰演練 Day 20

簡述OpenAccessContext的ObjectState狀態變化
快速入門系列中,我們展示了如何透過 OpenAccess ORM 建立、修改、刪除資料,但為什麼它會知道該轉換成對應的 Sql 呢?就是透過 ObjectState,本篇將簡述 ObjectState 並展示其變化。
快速入門系列中,我們展示了如何透過 OpenAccess ORM 建立、修改、刪除資料,但為什麼它會知道該轉換成對應的 Sql 呢?其實是因為 OpenAccessContext 有個狀態來記錄容器中實體的狀態,也就是透過 ObjectState。

為了展示 ObjectState 的變化,我們重新建立一個新的 Windows 主控台專案,然後在專案新增一個 OpenAccess Model,將北風資料庫加入模型中。因為已經是 OpenAccess 第二十篇文章了,就不再說明上述的流程,若有疑問,可參閱快速入門系列的前五篇。

現在,我們在專案的 Module1.vb 中加入以下程式碼:

Imports Telerik.OpenAccess

Module Module1

    Sub Main()
        Console.WriteLine("-----新建類別----")
        OutputCreateState()
        Console.WriteLine("-----新建類別再行物件容器中移除----")
        OutputCreateAndDeleteState()
        Console.WriteLine("-----新建類別並更新屬性----")
        OutputCreateAndUpdateState()
        Console.ReadLine()
    End Sub

    Sub OutputCreateState()
        Using dbContext As New NWModel()
            'Create a new category
            Dim newCategory As New Categories() With
            {
                .CATEGORYNAME = "Leo的新類別",
                .DESCRIPTION = "類別描述"
            }
            Dim state As ObjectState = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別尚未加入物件容器的狀態:" & state.ToString())
            dbContext.Add(newCategory)
            state = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別加入物件容器後的狀態:" & state.ToString())
            dbContext.SaveChanges()
            state = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別執行SaveChange函式後的狀態:" & state.ToString())

        End Using
    End Sub

    Sub OutputCreateAndUpdateState()
        Using dbContext As New NWModel()
            Dim newCategory As New Categories() With
            {
                .CATEGORYNAME = "這是新類別01",
                .DESCRIPTION = "新類別呦~~"
            }
            dbContext.Add(newCategory)
            Dim state As ObjectState = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別加入物件容器後的狀態:" & state.ToString())
            newCategory.CATEGORYNAME = "換個類別名稱"
            state = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別加入物件容器後改類別名稱的狀態:" & state.ToString())
            dbContext.SaveChanges()
            state = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別執行SaveChange函式後的狀態:" & state.ToString())
        End Using
    End Sub

    Sub OutputCreateAndDeleteState()
        Using dbContext As New NWModel()
            Dim newCategory As New Categories() With
            {
                .CATEGORYNAME = "新類別",
                .DESCRIPTION = "新類別呦~~"
            }
            Dim state As ObjectState = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別尚未加入物件容器的狀態:" & state.ToString())
            dbContext.Add(newCategory)
            state = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別加入物件容器後的狀態:" & state.ToString())
            dbContext.Delete(newCategory)
            state = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別加入物件容器後再執行刪除的狀態:" & state.ToString())
            dbContext.SaveChanges()
            state = dbContext.GetState(newCategory)
            Console.WriteLine("新建類別執行SaveChange函式後的狀況:" & state.ToString())
        End Using
    End Sub

End Module

上述程式碼,我們會看到兩種不同流程下,所產生的 ObjectState:

一開始建立一個新的物件實體時,還沒加入物件容器,狀態一定是 NotManaged,加入物件容器後,狀態異動為 New,此時再對實體更新屬性,狀態不會變更,但是若執行移除,則狀態會異動為 NewDeleted。

執行 OpenAccessContext.SaveChange() 函式後,若實體仍存在於物件容器中,狀態會是 Hollow,但若是 NewDeleted 狀態調用 SaveChange() 函式,因為此時實體已經不存在於容器中,所以狀態回到 NotManaged。


上一篇
OpenAccess ORM for Oracle 實戰演練 Day 19
下一篇
OpenAccess ORM for Oracle 實戰演練 Day 21
系列文
OpenAccess ORM for Oracle 實戰演練26

尚未有邦友留言

立即登入留言