diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index b81aea8..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: 10.0.x - include-prerelease: true - name: Build with dotnet run: dotnet build "./src/SimplerSoftware.EntityFrameworkCore.SqlServer.NodaTime.sln" --configuration Release # name: Execute Tests 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 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)