簡述OpenAccessContext的ObjectState狀態變化

  • 1381
  • 0
  • 2013-10-13

簡述OpenAccessContext的ObjectState狀態變化

DotBlogs Tags: , , , , ,

快速入門系列中,我們展示了如何透過 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:

214145

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

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

--------
沒什麼特別的~
不過是一些筆記而已