-
Notifications
You must be signed in to change notification settings - Fork 148
Description
Describe the bug
SQLProvider is incompatible with Npgsql 10.0, which changed the default .NET mapping for PostgreSQL date columns from System.DateTime to System.DateOnly (and time from TimeSpan to TimeOnly).
To Reproduce
CREATE TABLE test (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
d DATE NOT NULL
);
INSERT INTO test (d) VALUES ('2024-01-28');open FSharp.Data.Sql.PostgreSql
open FSharp.Data.Sql.Common
type Db = SqlDataProvider<
DatabaseProviderTypes.POSTGRESQL,
"Host=localhost;Database=test;Username=postgres;Password=test">
let ctx = Db.GetDataContext()
for row in query { for r in ctx.Public.Test do select r } do
printfn "%A" row.D // throws InvalidCastException with Npgsql 10Environment (please complete the following information):
- PostgreSQL v15.12
<PackageReference Include="Npgsql" Version="10.0.1" />
<PackageReference Include="SQLProvider.PostgreSql" Version="1.5.17" />
Additional context
This is from an analysis by Claude.
SQLProvider's PostgreSQL provider internally calls
GetDateTime()on theNpgsqlDataReaderwhen readingdatecolumns. In Npgsql 10.0, this throws anInvalidCastExceptionat runtime because the reader now returnsDateOnlyby default fordatecolumns.The build succeeds because SQLProvider's type mapping is resolved at design time independently of Npgsql's runtime behavior. The failure only surfaces at runtime when rows are actually read.
Workaround
Apply the Npgsql 10.0 legacy behavior opt-out via
AppContextswitch as documented in the Npgsql 10.0 release notes.
Additional References