다음을 통해 공유


방법: 데이터베이스 값을 보존하여 충돌 해결

변경 내용을 다시 전송하기 전에 예상 데이터베이스 값과 실제 데이터베이스 값의 차이를 조정하려면 OverwriteCurrentValues를 사용하여 데이터베이스에서 찾은 값을 유지합니다. 그런 다음 개체 모델의 현재 값을 덮어씁니다. 자세한 내용은 낙관적 동시성: 개요를 참조하세요.

참고 항목

모든 경우에 데이터베이스에서 업데이트된 데이터를 검색하여 클라이언트의 레코드를 먼저 새로 고칩니다. 이렇게 하면 다음 업데이트 시도는 동일한 동시성 검사에서 실패하지 않습니다.

예시

이 시나리오에서는 User1이 변경 내용을 제출하려는 경우 User2가 그 동안에 Assistant 열과 Department 열을 변경했기 때문에 ChangeConflictException 예외가 throw됩니다. 다음 표에서는 상황을 보여 줍니다.

State(상태) Manager 도우미 부서
User1과 User2가 쿼리했을 때 원래 데이터베이스 상태 Alfreds Maria Sales
User1이 변경 내용 전송 준비 Alfred 마케팅
User2가 이미 변경 내용 전송 Mary 서비스

User1이 최신 데이터베이스 값으로 개체 모델의 현재 값을 덮어써서 이 충돌을 해결하려고 합니다.

User1이 OverwriteCurrentValues를 사용하여 충돌을 해결하는 경우 데이터베이스의 결과는 다음 표와 같습니다.

State(상태) Manager 도우미 부서
충돌 해결 후 변경된 상태 Alfreds

(원래 값)
Mary

(User2가 전송한 값)
서비스

(User2가 전송한 값)

다음 예제 코드에서는 개체 모델의 현재 값을 데이터베이스 값으로 덮어쓰는 방법을 보여 줍니다. 각 멤버 충돌에 대한 검사 또는 사용자 지정 처리는 발생하지 않습니다.

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);
    }
}
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

참고 항목