diff --git a/backend/src/Taskdeck.Infrastructure/Persistence/TaskdeckDbContext.cs b/backend/src/Taskdeck.Infrastructure/Persistence/TaskdeckDbContext.cs index 91c4747b2..bacf2d01b 100644 --- a/backend/src/Taskdeck.Infrastructure/Persistence/TaskdeckDbContext.cs +++ b/backend/src/Taskdeck.Infrastructure/Persistence/TaskdeckDbContext.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Taskdeck.Domain.Agents; using Taskdeck.Domain.Entities; @@ -55,10 +56,43 @@ public TaskdeckDbContext(DbContextOptions options) : base(opt public DbSet TomorrowNotes => Set(); public DbSet McpToolHashes => Set(); + /// + /// SQLite stores DateTime as TEXT without timezone info. EF Core materializes + /// these as DateTimeKind.Unspecified, which causes incorrect comparisons with + /// DateTime.UtcNow. Apply UTC normalization globally via conventions so every + /// DateTime property is materialized with DateTimeKind.Utc. + /// See: https://github.com/Chris0Jeky/Taskdeck/issues/1191 + /// + protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) + { + configurationBuilder.Properties() + .HaveConversion(); + configurationBuilder.Properties() + .HaveConversion(); + } + protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfigurationsFromAssembly(typeof(TaskdeckDbContext).Assembly); } + + private sealed class UtcDateTimeConverter : ValueConverter + { + public UtcDateTimeConverter() : base( + v => v, + v => DateTime.SpecifyKind(v, DateTimeKind.Utc)) + { + } + } + + private sealed class NullableUtcDateTimeConverter : ValueConverter + { + public NullableUtcDateTimeConverter() : base( + v => v, + v => v.HasValue ? DateTime.SpecifyKind(v.Value, DateTimeKind.Utc) : v) + { + } + } }