DateOnly und TimeOnly in EF Core
- Matt
Wer nur ein Geburtsdatum oder eine Öffnungszeit speichern wollte, griff früher zu DateTime und ignorierte den überflüssigen Teil - oder normalisierte ihn von Hand auf Mitternacht, damit Vergleiche nicht plötzlich fehlschlagen. Seit EF Core 8 gibt es DateOnly und TimeOnly als eigene Typen, und der SQL-Server-Provider bildet sie ohne Zusatzkonfiguration ab: DateOnly wird zur Spalte date, TimeOnly zu time. Eine Migration erzeugt das automatisch, sobald eine Entität die Typen verwendet.
Der Haken: time in SQL Server kennt keine Zeitzone, und TimeOnly genauso wenig. Für Öffnungszeiten, die je nach Sommer- oder Winterzeit einen anderen UTC-Offset haben, hilft das nicht weiter - das muss man weiterhin selbst rechnen. Wer noch auf EF Core 6 oder 7 sitzt, braucht dafür das Paket ErikEJ.EntityFrameworkCore.SqlServer.DateOnlyTimeOnly, denn native Unterstützung gibt es erst ab Version 8.
Wie man Spaltentypen und Präzision in EF Core sonst noch einstellt, hatte ich in .NET 6 Entity Framework - Präzision einstellen beschrieben.