diff options
author | crupest <crupest@outlook.com> | 2020-08-11 18:22:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-11 18:22:43 +0800 |
commit | 8999e174b984938760b020e08b9b9d1e886a6941 (patch) | |
tree | 20bfb96ab9935d96d5ea15b2fb89348bcd941ebf /Timeline/Entities/UtcDateAnnotation.cs | |
parent | d529b53530270cd7c5d9a90ebcb11e49f7b1eb0d (diff) | |
parent | ed0e023e2eb2cc297ea0d60ea3f20c12ad83cfa8 (diff) | |
download | timeline-8999e174b984938760b020e08b9b9d1e886a6941.tar.gz timeline-8999e174b984938760b020e08b9b9d1e886a6941.tar.bz2 timeline-8999e174b984938760b020e08b9b9d1e886a6941.zip |
Merge pull request #146 from crupest/fix-141
Fix #141 .
Diffstat (limited to 'Timeline/Entities/UtcDateAnnotation.cs')
-rw-r--r-- | Timeline/Entities/UtcDateAnnotation.cs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Timeline/Entities/UtcDateAnnotation.cs b/Timeline/Entities/UtcDateAnnotation.cs new file mode 100644 index 00000000..6600e701 --- /dev/null +++ b/Timeline/Entities/UtcDateAnnotation.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using System;
+
+namespace Timeline.Entities
+{
+ // Copied from https://github.com/dotnet/efcore/issues/4711#issuecomment-589842988
+ public static class UtcDateAnnotation
+ {
+ private const string IsUtcAnnotation = "IsUtc";
+ private static readonly ValueConverter<DateTime, DateTime> UtcConverter =
+ new ValueConverter<DateTime, DateTime>(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc));
+
+ public static PropertyBuilder<TProperty> IsUtc<TProperty>(this PropertyBuilder<TProperty> builder, bool isUtc = true) =>
+ builder.HasAnnotation(IsUtcAnnotation, isUtc);
+
+ public static bool IsUtc(this IMutableProperty property) =>
+ ((bool?)property.FindAnnotation(IsUtcAnnotation)?.Value) ?? true;
+
+ /// <summary>
+ /// Make sure this is called after configuring all your entities.
+ /// </summary>
+ public static void ApplyUtcDateTimeConverter(this ModelBuilder builder)
+ {
+ foreach (var entityType in builder.Model.GetEntityTypes())
+ {
+ foreach (var property in entityType.GetProperties())
+ {
+ if (!property.IsUtc())
+ {
+ continue;
+ }
+
+ if (property.ClrType == typeof(DateTime))
+ {
+ property.SetValueConverter(UtcConverter);
+ }
+ }
+ }
+ }
+ }
+}
|