SQLite ne prend pas en charge nativement les types DateTime et DateTimeOffset dans Entity Framework Core. Cette limitation peut être contournée en utilisant un convertisseur de valeurs pour transformre les dates en timestamps numériques.
Dans la configuration du modèle, vérifiez si le fournisseur de base de données est SQLite et appliquez une conversion automatique à toutes les propriétés de type DateTime.
Voici un exemple de code adapté :
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
if (Database.ProviderName == "Microsoft.EntityFrameworkCore.Sqlite")
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
var dateProperties = entityType.ClrType.GetProperties()
.Where(p => p.PropertyType == typeof(DateTime) || p.PropertyType == typeof(DateTime?));
foreach (var property in dateProperties)
{
modelBuilder
.Entity(entityType.Name)
.Property(property.Name)
.HasConversion(new DateTimeToLongConverter());
}
}
}
}
Définissez ensuite un convertisseur personnalisé :
public class DateTimeToLongConverter : ValueConverter<datetime long="">
{
public DateTimeToLongConverter(ConverterMappingHints mappingHints = null)
: base(
date => DateConversionHelper.ToTimestamp(date),
date => DateConversionHelper.FromTimestamp(date),
mappingHints)
{
}
}
</datetime>
La classe d'aide pour les conversions :
public static class DateConversionHelper
{
private static readonly DateTime EpochReference = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long ToTimestamp(DateTime dateTime)
{
DateTime utcDate = dateTime.ToUniversalTime();
TimeSpan elapsed = utcDate - EpochReference;
return (long)elapsed.TotalMilliseconds;
}
public static DateTime FromTimestamp(long timestamp)
{
DateTime utcDate = EpochReference.AddMilliseconds(timestamp);
return utcDate.ToLocalTime();
}
}
Cette méthode assure une compatibilité complète avec SQLite et mainteint une précision à la milliseconde pour les opérations de date.
Références techniques :
- Problèmes connus de Entity Framework Core avec SQLite : https://github.com/dotnet/efcore/issues/9071
- Documentation sur les limitations des fournisseurs SQLite : https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations
- Exemples de convertion de valeurs dans EF Core : https://github.com/dotnet/efcore/tree/main/src/EFCore/Storage/ValueConversion