Практическое руководство. Отправка изменений в базу данных
Независимо от количества изменений, произведенных над объектами, эти изменения выполняются только над репликам, содержащимся в памяти. Фактические данные в базе данных при этом не изменяются. Изменения не передаются на сервер до тех пор, пока не будет явно вызван метод SubmitChanges класса DataContext.
При вызове этого метода класс DataContext пытается преобразовать сделанные изменения в эквивалентные команды SQL. Вы можете использовать собственную пользовательскую логику для переопределения этих действий, но порядок отправки управляется службой известного DataContext как обработчик изменений. Последовательность событий следующая:
При вызове SubmitChangesLINQ 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