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
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Cancellare una run di un workflow di GitHub
Eseguire script pre e post esecuzione di un workflow di GitHub
Applicare un filtro per recuperare alcune issue di GitHub
Path addizionali per gli asset in ASP.NET Core MVC
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Recuperare l'ultima versione di una release di GitHub
La gestione della riconnessione al server di Blazor in .NET 9
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Eliminare una project wiki di Azure DevOps
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Eseguire query in contemporanea con EF