Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 usare 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. La sequenza degli eventi è la seguente:
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.
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.
Immediatamente prima della trasmissione di una qualsiasi modifica effettiva, LINQ to SQL avvia una transazione per incapsulare la serie di singoli comandi.
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.
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