Versione dopo versione, il team di EF ha aggiunto diversi punti di estensione per intercettare eventi nel momento in cui questi si verificano. I primi punti di intercettazione sono stati quelli che si inserivano nella pipeline di esecuzione del codice SQL. Successivamente si sono aggiunti eventi per la fase di aggiunta e rimozione delle entity dal meccanismo di tracking e per la fase precedente e successiva alla persistenza sul database.
Entity Framework 7 introduce nuovi punti di estensione tra cui quello relativo alla materializzazione delle entity. La materializzazione è il processo di creazione dell'entity e il successivo popolamento delle proprietà partendo dai dati provenienti dalle query fatte al database. Se vogliamo personalizzare il processo di materializzazione, dobbiamo creare un interceptor che implementa l'interfaccia IMaterializationInterceptor e implementare almeno uno dei metodi dell'interfaccia (che fornisce già un'implementazione di base).
- CreatingInstance: invocato prima di istanziare l'entity. Implementando questo metodo possiamo creare noi l'entity scartando l'istanza creata da EF. Torna utile quando vogliamo usare una factory per creare le entity;
- CreatedInstance: invocato dopo che l'entity è stata istanziata;
- InitializingInstance: invocato prima di popolare le proprietà dell'entity;
- InitializedInstance: invocato dopo aver popolato le proprietà dell'entity;
Supponiamo di dover mantenere nelle entity la data di materializzazione dal database, in questo caso possiamo far implementare un'interfaccia alle entity e nel metodo InitializedInstanze verificare che se l'entity materializzata implementa quell'interfaccia allora andiamo a popolare la data di materializzazione.
public interface IHasMaterializationDate { DateTime MaterializationDate { get; set; } } public class Person : IHasMaterializationDate { public int Id { get; set; } public string Name { get; set; } = null!; [NotMapped] public DateTime MaterializationDate { get; set; } } public class MaterializationDateInterceptor : IMaterializationInterceptor { public object InitializedInstance(MaterializationInterceptionData materializationData, object instance) { if (instance is IHasMaterializationDate hasMaterializationDate) { hasMaterializationDate.MaterializationDate = DateTime.UtcNow; } return instance; } }
Una volta creato l'interceptor, non ci resta che aggiungerlo alla lista degli interceptor in fase di configurazione utilizzando le API di EF già esistenti.
public class PeopleContext : DbContext { private static readonly MaterializationDateInterceptor _materializationDateInterceptor = new(); public DbSet<Person> People => Set<Person>(); protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .AddInterceptors(_materializationDateInterceptor) .UseSqlServer(connectionstring); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire attività basate su eventi con Azure Container Jobs
Generare file per il download da Blazor WebAssembly
Collegare servizi a Azure Container App con i service connector
Abilitare automaticamente Dependabot in tutti i repository di una organizzazione su GitHub
Bloccare una pull request che arriva da branch non definiti in GitHub
Creare form tipizzati con Angular
Utilizzare i nuovi piani dedicati di Azure Container Apps
Gestire tipi complessi in query string grazie a IParsable in ASP.NET Core 7.0
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Specificare il versioning nel path degli URL in ASP.NET Web API
Utilizzo di Set e Array in JavaScript
Migliorare la scalabilità di ASP.NET Core 7 grazie all'output cache
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare i primary constructor in C#
- Installare le Web App site extension tramite una pipeline di Azure DevOps
- tra poco è la volta di #spa, #javascript e #angularjs per lo sviluppatore #aspnet con @sm15455: https://aspit.co/web15-live #aspilive
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- #vs2013, #windowsserver 2012 r2, #sqlserver 2014 e #tfs 2013 annunciati a #msteched. approfondimenti in seguito: https://aspit.co/amo