Quando eseguiamo la cancellazione di una entity, Entity Framework verifica sempre che l'operazione di DELETE sul database abbia effettivamente eliminato il record e, in caso negativo, Entity Framework lancia una DbUpdateConcurrencyException. Tuttavia quando eseguiamo la cancellazione di una entity e questa risulta già cancellata, potremmo non voler sollevare alcuna eccezione visto che il risultato di cancellare il dato è stato ottenuto.
A partire da Entity Framework 7, possiamo creare un interceptor che intercetta il momento in cui Entity Framework solleva la DbUpdateConcurrencyException e sopprimere questo comportamento. L'interceptor deve implementare l'interfaccia ISaveChangesInterceptor e implementare il metodo ThrowingConcurrencyException, o la sua controparte asincrona, che viene scatenato quando Entity Framework verifica un errore di concorrenza. All'interno del metodo verifichiamo se l'errore proviene da un'operazione di delete e in caso positivo sopprimiamo l'eccezione.
public class SuppressDeleteConcurrencyInterceptor : ISaveChangesInterceptor
{
public InterceptionResult ThrowingConcurrencyException(
ConcurrencyExceptionEventData eventData,
InterceptionResult result)
{
if (eventData.Entries.All(e => e.State == EntityState.Deleted))
{
return InterceptionResult.Suppress();
}
return result;
}
public ValueTask<InterceptionResult> ThrowingConcurrencyExceptionAsync(
ConcurrencyExceptionEventData eventData,
InterceptionResult result,
CancellationToken cancellationToken = default) =>
new(ThrowingConcurrencyException(eventData, result));
}Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Loggare le query più lente con Entity Framework
Abilitare automaticamente il force push di un gruppo su Azure DevOps
Il nuovo controllo Range di Blazor 9
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Impostare automaticamente l'altezza del font tramite CSS
Eseguire query in contemporanea con EF
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Creare una libreria CSS universale: Nav menu
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Utilizzare una qualunque lista per i parametri di tipo params in C#
Supportare la crittografia di ASP.NET Core con Azure Container App


