From 68812c0d208bcebbf00a06b3f90d8895f019ec76 Mon Sep 17 00:00:00 2001 From: Steven Rasmussen Date: Fri, 8 May 2026 08:06:36 -0600 Subject: [PATCH 1/3] Fixes #52 --- .claude/settings.local.json | 9 +++++ .../DateTimeQueryTests.cs | 37 +++++++++++++++++++ ...ityFrameworkCore.SqlServer.NodaTime.csproj | 2 +- ...qlServerNodaTimeTypeMappingSourcePlugin.cs | 8 +++- 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..2594431 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,9 @@ +{ + "permissions": { + "allow": [ + "Bash(ls /tmp/)", + "Bash(mkdir -p /tmp/eftest)", + "Bash(git *)" + ] + } +} diff --git a/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.Tests/DateTimeQueryTests.cs b/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.Tests/DateTimeQueryTests.cs index 9b4a48c..ecf73ed 100644 --- a/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.Tests/DateTimeQueryTests.cs +++ b/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.Tests/DateTimeQueryTests.cs @@ -22,5 +22,42 @@ public async Task DateTime_Date_Test() Assert.Equal(6, raceResults.Count); } + + [Fact] + public async Task DateTime_UtcNow_Test() + { + var raceResults = await this.Db.Race.Select(r => new { NowUtc = DateTime.UtcNow }).ToListAsync(); + + Assert.Equal( + condense(@$"SELECT GETUTCDATE() AS [NowUtc] FROM [Race] AS [r]"), + condense(this.Db.Sql)); + + Assert.Equal(12, raceResults.Count); + } + + [Fact] + public async Task DateTime_UtcNow_Compared_Test() + { + var raceResults = await this.Db.Race.Where(r => r.DateTimeDate.Date >= DateTime.UtcNow).ToListAsync(); + + Assert.Equal( + condense(@$"{RaceSelectStatement} WHERE CONVERT(date, [r].[DateTimeDate]) >= GETUTCDATE()"), + condense(this.Db.Sql)); + + Assert.Equal(0, raceResults.Count); + } + + [Fact] + public async Task DateTime_UtcNow_And_Input_Parameter_Test() + { + var dt = new DateTime(2019, 7, 1); + var raceResults = await this.Db.Race.Where(r => dt >= DateTime.UtcNow).ToListAsync(); + + Assert.Equal( + condense(@$"{RaceSelectStatement} WHERE @dt >= GETUTCDATE()"), + condense(this.Db.Sql)); + + Assert.Equal(0, raceResults.Count); + } } } \ No newline at end of file diff --git a/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.csproj b/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.csproj index 690ddfc..b85a571 100644 --- a/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.csproj +++ b/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.csproj @@ -14,7 +14,7 @@ https://github.com/StevenRasmussen/EFCore.SqlServer.NodaTime git Entity Framework Core;entity-framework-core;EF;Data;O/RM;EntityFrameworkCore;EFCore;Noda;NodaTime;Noda Time - 10.0.0 + 10.0.1 README.md diff --git a/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/Storage/SqlServerNodaTimeTypeMappingSourcePlugin.cs b/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/Storage/SqlServerNodaTimeTypeMappingSourcePlugin.cs index 4759045..311dd26 100644 --- a/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/Storage/SqlServerNodaTimeTypeMappingSourcePlugin.cs +++ b/src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime/Storage/SqlServerNodaTimeTypeMappingSourcePlugin.cs @@ -60,8 +60,12 @@ public RelationalTypeMapping FindMapping(in RelationalTypeMappingInfo mappingInf { if (StoreTypeMappings.TryGetValue(storeTypeName, out var mappings)) { + // When clrType is null, defer to EF Core's default mapping source: our store + // types (datetime, datetime2, etc.) all have non-NodaTime defaults that EF + // can supply. Returning a NodaTime mapping here pollutes plain DateTime + // expressions like DateTime.UtcNow with InstantValueConverter. if (clrType == null) - return mappings[0]; + return null; foreach (var m in mappings) if (m.ClrType == clrType) @@ -73,7 +77,7 @@ public RelationalTypeMapping FindMapping(in RelationalTypeMappingInfo mappingInf if (StoreTypeMappings.TryGetValue(storeTypeNameBase!, out mappings)) { if (clrType == null) - return mappings[0].Clone(mappingInfo); + return null; foreach (var m in mappings) if (m.ClrType == clrType) From a93240f1c0f7b02cc674ca8bd7d4dcf307f9193a Mon Sep 17 00:00:00 2001 From: Steven Rasmussen Date: Fri, 8 May 2026 08:08:57 -0600 Subject: [PATCH 2/3] Updated gitignore --- .claude/settings.local.json | 9 --------- .gitignore | 5 ++++- 2 files changed, 4 insertions(+), 10 deletions(-) delete mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 2594431..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(ls /tmp/)", - "Bash(mkdir -p /tmp/eftest)", - "Bash(git *)" - ] - } -} diff --git a/.gitignore b/.gitignore index 2f1229f..433d2a1 100644 --- a/.gitignore +++ b/.gitignore @@ -347,4 +347,7 @@ healthchecksdb MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder -.ionide/ \ No newline at end of file +.ionide/ + +# Claude Code local config +.claude/ \ No newline at end of file From f80b9c01c5ad94ffb380b9b0906059bac4c963d1 Mon Sep 17 00:00:00 2001 From: Steven Rasmussen Date: Fri, 8 May 2026 08:11:32 -0600 Subject: [PATCH 3/3] Pipeline fixes for .Net 10 --- .github/workflows/dotnetcore.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index d1f5722..fc61b8f 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -8,12 +8,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Setup .NET Core - uses: actions/setup-dotnet@v1 + - uses: actions/checkout@v4 + - name: Setup .NET + uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.x - include-prerelease: true + dotnet-version: 10.0.x - name: Build with dotnet run: dotnet build "./src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.sln" --configuration Release # name: Execute Tests