.NET 6 ha introdotto il nuovo tipo DateOnly che permette di gestire una data senza l'aggiunta dell'orario. Purtroppo, il provider di EF Core 6 per Sql Server non introduce un supporto nativo al tipo DateOnly, sebbene Sql Server permetta di creare colonna di tipo Date (l'equivalente Sql di DateOnly). Se proviamo a mappare un campo Date su una proprietà di tipo DateOnly, EF Core 6 solleva con un eccezione che ci notifica che DateOnly è un tipo non gestito. Tuttavia, una colonna di tipo Date di Sql Server può essere mappata su una proprietà di tipo DateTime e possiamo sfruttare questa capacità del provider per usare il tipo DateOnly tramite un value converter custom.
Poiché EF Core supporta il tipo DateTime, tutto quello che dobbiamo fare è creare un converter che sia in grado di convertire il nostro DateOnly in un DateTime e viceversa.
public class DateOnlyConverter : ValueConverter<DateOnly, DateTime> { public DateOnlyConverter(): base( (DateOnly d) => d.ToDateTime(TimeOnly.MinValue), (DateTime d) => DateOnly.FromDateTime(d), null) { } }
Questo converter è sfruttato in due fasi dalla pipeline di EF Core. La prima è quando si deve tradurre la query in SQL. In questa fase viene chiamata la prima funzione passata in input al costruttore. Questa converte un oggetto DateOnly in un oggeto DateTime che il provider di EF Core riconosce e quindi può tradurre in SQL per eseguire una query su un campo Date. La seconda fase è quando si devono materializzare gli oggetti con i dati recuperati dal database. In questa fase viene invocato il secondo metodo che accetta un oggetto di tipo DateTime e lo trasforma in un oggetto di tipo DateOnly.
Ora non ci rimane che configurare il converter all'interno del contesto di EF Core.
public class MyDbContext : DbContext { ... protected override void ConfigureConventions(ModelConfigurationBuilder builder) { builder.Properties<DateOnly>().HaveConversion<DateOnlyConverter>(); } }
Grazie al nuovo metodo ConfigureConventions, possiamo applicare il converter a tutte le proprietà di tipo DateOnly in un punto solo, semplificando notevolmente il codice.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Supportare la crittografia di ASP.NET Core con Azure Container App
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Anonimizzare i dati sensibili nei log di Azure Front Door
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Gestire codice JavaScript con code splitting e lazy loading
Ordine e importanza per @layer in CSS
Testare il failover sulle region in Azure Storage
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Configurare e gestire sidecar container in Azure App Service
Potenziare la ricerca su Cosmos DB con Full Text Search
Migliorare la scalabilità delle Azure Function con il Flex Consumption
I più letti di oggi
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- .NET Conference Italia 2025 - Milano
- The Agentic Day - Milano
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9