Как отправить изменения в базу данных (LINQ to SQL)

Независимо от количества изменений, произведенных над объектами, эти изменения выполняются только над репликам, содержащимся в памяти. Фактические данные в базе данных при этом не изменяются. Изменения не передаются на сервер до тех пор, пока не будет явно вызван метод SubmitChanges класса DataContext.

При вызове этого метода класс 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)