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
Creare agenti facilmente con Azure AI Agent Service
Applicare un filtro per recuperare alcune issue di GitHub
Creare una libreria CSS universale - Rotazione degli elementi
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Creare una libreria CSS universale: Clip-path
Path addizionali per gli asset in ASP.NET Core MVC
Gestione degli eventi nei Web component HTML
Utilizzare Azure AI Studio per testare i modelli AI
Utilizzare Azure Cosmos DB con i vettori
Gestione degli stili CSS con le regole @layer
Creare un webhook in Azure DevOps
Gestione file Javascript in Blazor con .NET 9
I più letti di oggi
- a #RealCodeConf4 il 25 maggio a Firenze parleremo di #silverlight4. iscrizioni gratis su http://u.aspitalia.com/g9
- #HTML5 schema per avere l'intellisense su #VS2008 (anche express) http://u.aspitalia.com/ed
- Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
- Rendere sicuro l'endpoint di HealthCheck in ASP.NET Core
- prime app per #wp7summer. vuoi fare strada con #wp7? 5 app e partecipi alla nostra nuova competition: http://aspitalia.com/yu #wp7dev
- disponibile #azure sdk 2.1, con supporto a #vs13 e nuovi tool per #vs12: https://aspit.co/ans