共用方式為


HOW TO:藉由保留資料庫值來解決並行衝突 (LINQ to SQL)

若要先協調預期和實際資料庫值之間的差異再重新送出變更,可以使用 OverwriteCurrentValues 將找到的值保留在資料庫中。 這樣會覆寫物件模型 (Object Model) 中的目前值。 如需詳細資訊,請參閱開放式並行存取概觀 (LINQ to SQL)

注意事項注意事項

在所有情況下,擷取資料庫中更新過的資料會先重新整理用戶端上的資料錄。這個動作可確保下一次嘗試更新時,不會在相同的並行存取檢查時失敗。

範例

在這個案例下,當 User1 嘗試送出變更時,因為 User2 同時變更了 Assistant 和 Department 資料行,所以會擲回 ChangeConflictException 例外狀況。 下表顯示這個情況。

 

Manager

Assistant

Department

User1 和 User2 查詢時的原始資料庫狀態。

Alfreds

Maria

Sales

User1 準備送出這些變更。

Alfred

 

Marketing

User2 已送出這些變更。

 

Mary

Service

User1 決定讓較新的資料庫值覆寫物件模型中的目前值,來解決這個衝突。

User1 使用 OverwriteCurrentValues 解決衝突時,資料庫中的結果會如同下表:

 

Manager

Assistant

Department

解決衝突後的新狀態。

Alfreds

(原始)

Mary

(來自 User2)

Service

(來自 User2)

下列範例程式碼顯示如何使用資料庫值來覆寫物件模型中的目前值 (但不會對個別成員衝突進行任何檢查或自訂處理)。

Dim db As New Northwnd("...")

Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

Catch ex As ChangeConflictException
    Console.WriteLine(ex.Message)

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' All database values overwrite current values.
        occ.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues)
    Next

End Try
Northwnd db = new Northwnd("...");
try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        // All database values overwrite current values.
        occ.Resolve(RefreshMode.OverwriteCurrentValues);
    }
}

請參閱

其他資源

HOW TO:管理變更衝突 (LINQ to SQL)