Procedimiento para enviar los cambios a la base de datos

Con independencia de los cambios que se efectúen en los objetos, éstos sólo se realizan en las réplicas en memoria. Los cambios no se aplican a los datos reales de la base de datos. Los cambios no se transmiten al servidor hasta que se llama a SubmitChanges explícitamente en DataContext.

Al realizar esta llamada, DataContext intenta convertir los cambios a comandos SQL equivalentes. Puede utilizar su propia lógica personalizada para invalidar estas acciones, pero el orden de envío lo controla un servicio de DataContext que se conoce como procesador de cambios. Todo ocurre en este orden:

  1. Al llamar a SubmitChanges, LINQ to SQL examina el conjunto de objetos conocidos para determinar si se les han adjuntado nuevas instancias. En caso afirmativo, estas nuevas instancias se agregan al conjunto de objetos con seguimiento.

  2. Todos los objetos que tienen cambios pendientes se ordenan en una secuencia de objetos de acuerdo con las dependencias entre ellos. Los objetos con cambios que dependen de otros objetos se ordenan según sus dependencias.

  3. Inmediatamente antes de que se transmitan los verdaderos cambios, LINQ to SQL inicia una transacción para encapsular la serie de comandos individuales.

  4. Los cambios en los objetos se convierten uno a uno en comandos SQL y se envían al servidor.

En este punto, cualquier error detectado por la base de datos hace que se detenga el proceso de envío, y se inicia una excepción. Todos los cambios de la base de datos se revierten, como si no se hubiese enviado nada. DataContext mantiene un registro completo de todos los cambios. Por lo tanto, se puede intentar corregir el problema y llamar de nuevo a SubmitChanges, como en el ejemplo de código siguiente.

Ejemplo

Cuando la transacción relacionada con el envío se completa correctamente, DataContext recibe los cambios de los objetos sin tener en cuenta la información de seguimiento de cambios.

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

Consulte también