Ho 2 tabelle del database correlati, che nel look forma semplificata come questoLINQ to SQL: esecuzione degli ordini al momento della chiamata SubmitChanges()
Product(
product_id,
name
)
ProductSpecs(
spec_id,
product_id,
name,
value
)
chiave esterna viene impostato tramite campo product_id e tavolo ProductSpecs ha un vincolo univoco (product_id, name) pair.
Ora nella mia applicazione ASP.NET MVC quando l'utente modifica le specifiche del prodotto e salva i dati, elimino le vecchie specifiche e le inserisco tutte come nuove.
Faccio questo richiamando prima DataContext.DeleteAllOnSubmit() e fornendo prodotti (vecchi) attuali come parametro, quindi aggiungo nuove specifiche alla raccolta Product.ProductSpecs.
Quindi chiamo DataContext.SubmitChanges() e ricevo un errore che il mio vincolo univoco è stato violato.
Osservando le istruzioni SQL restituite da DataContenxt.GetChangeText(), posso vedere che gli INSERT vengono eseguiti prima dei DELETE (anche se ho chiamato DeleteAllOnSubmit() prima di Aggiungi).
Qual è la ragione di questo comportamento e come risolverlo o aggirarlo?
Grazie.
Hai provato a chiamare SubmitChanges() dopo aver chiamato DeleteAllOnSubmit, ma prima di aggiungere i nuovi record? – RobS
Questo eliminerebbe i record prima che io sappia per certo che i nuovi record sarebbero stati inseriti che è sbagliato. O esiste un modo per eseguire il rollback anche dopo la chiamata a SubmitChanges()? –
È possibile includere le chiamate in entrata in una transazione e nel rollback se non si trovano nuovi record da inserire. Sebbene tu possa controllare se hai nuovi record prima di fare la cancellazione. – RobS