방법: 데이터베이스에 변경 내용 전송
개체의 변경 내용 수에 관계없이 메모리 내의 복제본에만 변경 내용이 적용됩니다. 데이터베이스의 실제 데이터는 변경하지 않습니다. 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