From ad5c9e2017368e80cd93d5a9c3fc5e426d1b2651 Mon Sep 17 00:00:00 2001 From: Stephen Dahlke Date: Fri, 5 Dec 2025 17:11:07 +0000 Subject: [PATCH] fix: apply DateTime to DATE mapping --- .../Storage/Internal/SpannerDateDateTimeTypeMapping.cs | 10 ++++++++++ .../Storage/Internal/SpannerDateTypeMapping.cs | 9 ++++++++- .../Storage/Internal/SpannerTypeMappingSource.cs | 7 +++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateDateTimeTypeMapping.cs diff --git a/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateDateTimeTypeMapping.cs b/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateDateTimeTypeMapping.cs new file mode 100644 index 00000000..8c271dc2 --- /dev/null +++ b/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateDateTimeTypeMapping.cs @@ -0,0 +1,10 @@ +using System; + +namespace Google.Cloud.EntityFrameworkCore.Spanner.Storage.Internal; + +internal class SpannerDateDateTimeTypeMapping : SpannerDateTypeMapping +{ + public SpannerDateDateTimeTypeMapping() : base(typeof(DateTime)) + { + } +} \ No newline at end of file diff --git a/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateTypeMapping.cs b/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateTypeMapping.cs index 42cd7ed9..d60dfb17 100644 --- a/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateTypeMapping.cs +++ b/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerDateTypeMapping.cs @@ -25,8 +25,15 @@ internal class SpannerDateTypeMapping : RelationalTypeMapping v => SpannerDate.FromDateTime(v)); public SpannerDateTypeMapping() + : this(typeof(SpannerDate)) + { } + + protected SpannerDateTypeMapping(System.Type clrType) : base(new RelationalTypeMappingParameters( - new CoreTypeMappingParameters(typeof(SpannerDate), s_converter), + new CoreTypeMappingParameters(clrType, + // use converter only for SpannerDate; DateTime maps directly + clrType == typeof(SpannerDate) ? s_converter : null + ), "DATE", StoreTypePostfix.None, System.Data.DbType.Date)) { } diff --git a/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerTypeMappingSource.cs b/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerTypeMappingSource.cs index 9b00beeb..31019b48 100644 --- a/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerTypeMappingSource.cs +++ b/Google.Cloud.EntityFrameworkCore.Spanner/Storage/Internal/SpannerTypeMappingSource.cs @@ -38,6 +38,7 @@ private static readonly BoolTypeMapping s_bool = new SpannerBoolTypeMapping(SpannerDbType.Bool.ToString()); private static readonly SpannerDateTypeMapping s_date = new SpannerDateTypeMapping(); + private static readonly SpannerDateDateTimeTypeMapping s_dateTimeDate = new SpannerDateDateTimeTypeMapping(); private static readonly SpannerDateOnlyTypeMapping s_dateonly = new (); @@ -327,6 +328,12 @@ private RelationalTypeMapping FindRawMapping(RelationalTypeMappingInfo mappingIn if (_storeTypeMappings.TryGetValue(storeTypeName, out var mapping) || _storeTypeMappings.TryGetValue(storeTypeNameBase, out mapping)) { + // if DateTime is being used to map to DATE we need to use the default DateTime<>DateTime mapping instead of trying to use DateTime<>SpannerDate + if (mapping == s_date && clrType == typeof(DateTime)) + { + return s_dateTimeDate; + } + if (clrType == null || mapping.ClrType == clrType || mapping.Converter?.ProviderClrType == clrType)