using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using ScadaLink.ConfigurationDatabase; namespace ScadaLink.ConfigurationDatabase.Tests; /// /// Test DbContext that maps DateTimeOffset to a sortable string format for SQLite. /// EF Core 10 SQLite provider does not support ORDER BY on DateTimeOffset columns. /// public class SqliteTestDbContext : ScadaLinkDbContext { public SqliteTestDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Convert DateTimeOffset to ISO 8601 string for SQLite so ORDER BY works var converter = new ValueConverter( v => v.UtcDateTime.ToString("o"), v => DateTimeOffset.Parse(v)); var nullableConverter = new ValueConverter( v => v.HasValue ? v.Value.UtcDateTime.ToString("o") : null, v => v != null ? DateTimeOffset.Parse(v) : null); foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { foreach (var property in entityType.GetProperties()) { if (property.ClrType == typeof(DateTimeOffset)) { property.SetValueConverter(converter); property.SetColumnType("TEXT"); } else if (property.ClrType == typeof(DateTimeOffset?)) { property.SetValueConverter(nullableConverter); property.SetColumnType("TEXT"); } } } } } public static class SqliteTestHelper { public static ScadaLinkDbContext CreateInMemoryContext() { var options = new DbContextOptionsBuilder() .UseSqlite("DataSource=:memory:") .ConfigureWarnings(w => w.Ignore(RelationalEventId.PendingModelChangesWarning)) .Options; var context = new SqliteTestDbContext(options); context.Database.OpenConnection(); context.Database.EnsureCreated(); return context; } public static ScadaLinkDbContext CreateFileContext(string dbPath) { var options = new DbContextOptionsBuilder() .UseSqlite($"DataSource={dbPath}") .ConfigureWarnings(w => w.Ignore(RelationalEventId.PendingModelChangesWarning)) .Options; var context = new SqliteTestDbContext(options); return context; } }