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
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Usare le navigation property in QuickGrid di Blazor
Escludere alcuni file da GitHub Secret Scanning
Migrare una service connection a workload identity federation in Azure DevOps
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Sostituire la GitHub Action di login su private registry
Utilizzare Container Queries nominali
Ordine e importanza per @layer in CSS
Change tracking e composition in Entity Framework
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core