방법: 데이터베이스에 변경 내용 전송(LINQ to SQL)

업데이트: November 2007

개체의 변경 내용 수에 관계없이 메모리 내의 복제본에만 변경 내용이 적용됩니다. 데이터베이스의 실제 데이터는 변경하지 않습니다. DataContextSubmitChanges를 명시적으로 호출한 후에 변경 내용이 서버에 전송됩니다.

이러한 호출을 수행할 때 DataContext는 변경 내용을 해당 SQL 명령으로 변환하려고 합니다. 고유한 사용자 지정 논리를 사용하여 이러한 작업을 재정의할 수 있으나 전송 순서는 변경 프로세서라는 DataContext의 서비스를 통해 조정됩니다. 작업이 진행되는 순서는 다음과 같습니다.

  1. SubmitChanges를 호출하는 경우 LINQ to SQL에서는 알려진 개체 집합을 사용하여 새 인스턴스와의 연결 여부를 확인합니다. 새 인스턴스와 연결되어 있는 경우 새 인스턴스는 추적된 개체 집합에 추가됩니다.

  2. 보류 중인 변경 내용이 있는 모든 개체는 이들 간의 종속성을 기반으로 개체 시퀀스로 정렬됩니다. 다른 개체에 종속된 변경 내용을 가진 개체는 해당 종속 개체 뒤에 정렬됩니다.

  3. 실제 변경 내용이 전송되기 직전 LINQ to SQL에서는 트랜잭션을 시작하여 일련의 개별 명령을 캡슐화합니다.

  4. 개체에 대한 변경 내용은 하나씩 SQL 명령으로 변환되어 서버로 전송됩니다.

이때 데이터베이스에서 오류가 발견되면 전송 프로세스가 중지되고 예외가 발생합니다. 데이터베이스의 모든 변경 내용이 어떠한 전송도 발생하지 않은 것처럼 롤백됩니다. DataContext에는 여전히 모든 변경 내용에 대한 전체 기록이 있습니다. 따라서 문제를 해결하고 다음 코드 예제에서처럼 SubmitChanges를 다시 호출할 수 있습니다.

예제

전송 주위의 트랜잭션이 성공적으로 완료되는 경우 DataContext는 변경 추적 정보를 무시하여 개체의 변경 내용을 적용합니다.

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

참고 항목

작업

방법: 전송 충돌 검색 및 해결(LINQ to SQL)

개념

샘플 데이터베이스 다운로드(LINQ to SQL)

기타 리소스

방법: 변경 내용 충돌 관리(LINQ to SQL)

데이터 변경 및 변경 내용 전송(LINQ to SQL)