簡述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。
--------
沒什麼特別的~
不過是一些筆記而已