作法:將變更提交至資料庫
不論對物件進行多少的變更,都只會變更記憶體中的複本。 並不會變更到資料庫中的實際資料。 在 SubmitChanges 上明確呼叫 DataContext 之前,變更都不會傳輸至伺服器。
進行這個呼叫時,DataContext 會嘗試將變更轉譯為對等的 SQL 命令。 您可以使用您自己的自訂邏輯來覆寫這些動作,但是提交順序則是由 DataContext 的服務 (稱為變更處理器) 所安排。 事件的順序如下:
呼叫 SubmitChanges 時,LINQ to SQL 會檢查這組已知的物件,以判斷新的執行個體是否已附加至這組物件。 如果已連接,則這些新的執行個體會加入至這組已追蹤的物件中。
所有具有暫止變更的物件,都會根據它們之間的相依性來排序為一串物件。 而變更是根據其他物件的物件,則會循序放在它們的相依性後面。
在傳輸任何實際變更之前,LINQ to SQL 會先啟動交易來封裝一系列個別的命令。
物件的變更會一個接著一個地轉換為 SQL 命令,並傳送給伺服器。
此時,資料庫偵測到的任何錯誤都會停止提交流程,並引發例外狀況。 而資料庫的所有變更都會復原為未進行提交之前的狀態。 DataContext 仍然具有所有變更的完整記錄。 因此,您可以嘗試更正問題,並再次呼叫 SubmitChanges,如下列程式碼範例所示。
範例
當提交異動順利完成時,DataContext 會略過變更追蹤資訊,以接受物件的變更。
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Make changes here.
try
{
db.SubmitChanges();
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
// Make some adjustments.
// ...
// Try again.
db.SubmitChanges();
}
Dim db As New Northwnd("c:\northwnd.mdf")
' Make changes here.
Sub MakeChanges()
Try
db.SubmitChanges()
Catch e As ChangeConflictException
Console.WriteLine(e.Message)
' Make some adjustments
'...
' Try again.
db.SubmitChanges()
End Try
End Sub