From 54ecc39e1deddbd0c84c1ed1fbf6fed8a3e81cb2 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 9 Apr 2021 11:28:35 +0200 Subject: [PATCH] Fix date conversion issue with Sqlite provider --- .../Configuration/ValueConverters.cs | 2 ++ .../ElsaContext.cs | 22 ++++++++++++++++++- .../Extensions/DateTimeExtensions.cs | 9 ++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/DateTimeExtensions.cs diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/ValueConverters.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/ValueConverters.cs index 179c21740..0aba2bac6 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/ValueConverters.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/ValueConverters.cs @@ -1,4 +1,5 @@ using System; +using Elsa.Persistence.EntityFramework.Core.Extensions; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Newtonsoft.Json.Linq; using NodaTime; @@ -8,6 +9,7 @@ namespace Elsa.Persistence.EntityFramework.Core.Configuration public static class ValueConverters { public static readonly ValueConverter InstantConverter = new(x => x.ToDateTimeOffset(), x => Instant.FromDateTimeOffset(x)); + public static readonly ValueConverter SqliteInstantConverter = new(x => x.ToDateTimeUtc(), x => Instant.FromDateTimeUtc(x.WithKind(DateTimeKind.Utc))); public static readonly ValueConverter JObjectConverter = new(x => x!.ToString(), x => JObject.Parse(x)); } } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs index fbdab7235..c2e2a7e2a 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs @@ -1,5 +1,8 @@ -using Elsa.Models; +using System.Linq; +using Elsa.Models; +using Elsa.Persistence.EntityFramework.Core.Configuration; using Microsoft.EntityFrameworkCore; +using NodaTime; namespace Elsa.Persistence.EntityFramework.Core { @@ -17,6 +20,23 @@ namespace Elsa.Persistence.EntityFramework.Core protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(typeof(ElsaContext).Assembly); + + if (Database.ProviderName == "Microsoft.EntityFrameworkCore.Sqlite") + { + // SQLite does not have proper support for DateTimeOffset via Entity Framework Core, see the limitations + // here: https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations#query-limitations + foreach (var entityType in modelBuilder.Model.GetEntityTypes()) + { + var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(Instant) || p.PropertyType == typeof(Instant?)); + foreach (var property in properties) + { + modelBuilder + .Entity(entityType.Name) + .Property(property.Name) + .HasConversion(ValueConverters.SqliteInstantConverter); + } + } + } } } } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/DateTimeExtensions.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/DateTimeExtensions.cs new file mode 100644 index 000000000..78dc3434e --- /dev/null +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/DateTimeExtensions.cs @@ -0,0 +1,9 @@ +using System; + +namespace Elsa.Persistence.EntityFramework.Core.Extensions +{ + public static class DateTimeExtensions + { + public static DateTime WithKind(this DateTime dateTime, DateTimeKind kind) => new(dateTime.Ticks, kind); + } +} \ No newline at end of file