
Update interceptor per Entity Framework (.NET 8)
Un Update interceptor di Entity framework in .NET 8 permette di intercettare i salvataggi (dbContext.SaveChangesAsync) ed eseguire delle operazioni, come ad esempio impostare le date di creazione e/o modifica.
Per usarlo va creata una classe che eredita da SaveChangesInterceptor e implementa il metodo SavingChangesAsync
va poi aggiunto in fase di registrazione del servizio AddDbContext tramite AddInterceptors
Per usarlo va creata una classe che eredita da SaveChangesInterceptor e implementa il metodo SavingChangesAsync
C#: SaveChangesInterceptor
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using ReactApp1.Server.DTO.Entities;
namespace ReactApp1.Server.Repositories.MsSqlEf.Interceptors;
public class DatabaseUpdateInterceptor : SaveChangesInterceptor
{
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData, InterceptionResult<int> result, CancellationToken cancellationToken = default)
{
// Do something before saving changes
if (eventData.Context is not null)
{
var dbContext = eventData.Context;
foreach (var entry in dbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Added || e.State == EntityState.Modified))
{
// mi assicuro che le date di creazione e modifica siano sempre aggiornate
if (entry.Entity is TodoEntity todo)
{
todo.ModifyDate = DateTime.UtcNow;
if (entry.State == EntityState.Added)
{
todo.CreationDate = todo.ModifyDate;
}
}
}
}
return base.SavingChangesAsync(eventData, result, cancellationToken);
}
}
C#: AddDbContext
builder.Services.AddDbContext<DatabaseContext>(options =>
{
options.UseSqlServer(connectionString);
options.AddInterceptors(new DatabaseUpdateInterceptor());
});