分享方式:


作法:將變更提交至資料庫

不論對物件進行多少的變更,都只會變更記憶體中的複本。 並不會變更到資料庫中的實際資料。 在 SubmitChanges 上明確呼叫 DataContext 之前,變更都不會傳輸至伺服器。

進行這個呼叫時,DataContext 會嘗試將變更轉譯為對等的 SQL 命令。 您可以使用您自己的自訂邏輯來覆寫這些動作,但是提交順序則是由 DataContext 的服務 (稱為變更處理器) 所安排。 事件的順序如下:

  1. 呼叫 SubmitChanges 時,LINQ to SQL 會檢查這組已知的物件,以判斷新的執行個體是否已附加至這組物件。 如果已連接,則這些新的執行個體會加入至這組已追蹤的物件中。

  2. 所有具有暫止變更的物件,都會根據它們之間的相依性來排序為一串物件。 而變更是根據其他物件的物件,則會循序放在它們的相依性後面。

  3. 在傳輸任何實際變更之前,LINQ to SQL 會先啟動交易來封裝一系列個別的命令。

  4. 物件的變更會一個接著一個地轉換為 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

另請參閱