Condividi tramite


Procedura: inviare le modifiche al database (LINQ to SQL)

Indipendentemente da quante modifiche si apportano agli oggetti, queste vengono applicate solo alle repliche in memoria. Le modifiche non vengono apportate ai dati effettivi nel database e non saranno trasmesse al server finché non si chiama in modo esplicito SubmitChanges su DataContext.

Quando si effettua questa chiamata, DataContext tenta di convertire le modifiche in comandi SQL equivalenti. È possibile utilizzare logica personalizzata per eseguire l'override di queste azioni, tuttavia l'ordine di invio viene gestito da un servizio di DataContext detto processore delle modifiche. Di seguito viene riportata la sequenza degli eventi:

  1. Quando si chiama SubmitChanges, LINQ to SQL esamina il set di oggetti conosciuti per determinare se a tali oggetti sono state associate nuove istanze. In caso affermativo, queste nuove istanze vengono aggiunte al set di oggetti registrati.

  2. Tutti gli oggetti con modifiche in sospeso vengono ordinati in una sequenza di oggetti in base alle reciproche dipendenze. Gli oggetti le cui modifiche dipendono da altri oggetti vengono ordinati in sequenza dopo le relative dipendenze.

  3. Immediatamente prima della trasmissione di una qualsiasi modifica effettiva, LINQ to SQL avvia una transazione per incapsulare la serie di singoli comandi.

  4. Le modifiche agli oggetti vengono convertite una alla volta in comandi SQL e inviate al server.

Qualsiasi errore rilevato dal database in questa fase causa l'interruzione del processo di invio e la generazione di un'eccezione. Viene eseguito il rollback di tutte le modifiche al database come se non fosse mai stato eseguito alcun invio. In DataContext è tuttavia ancora presente una registrazione completa di tutte le modifiche, pertanto è possibile tentare di correggere il problema e chiamare nuovamente SubmitChanges, come nell'esempio di codice che segue.

Esempio

Quando la transazione relativa alla sottomissione viene completata correttamente, DataContext accetta le modifiche agli oggetti ignorando le informazioni di rilevamento delle modifiche.

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

Vedere anche

Attività

Procedura: rilevare e risolvere gli invii in conflitto (LINQ to SQL)

Concetti

Download dei database di esempio (LINQ to SQL)

Altre risorse

Procedura: gestire i conflitti di modifiche (LINQ to SQL)

Scrittura e invio di modifiche di dati (LINQ to SQL)