diff --git a/src/EFCore.PG.NTS/Storage/Internal/NpgsqlGeometryTypeMapping.cs b/src/EFCore.PG.NTS/Storage/Internal/NpgsqlGeometryTypeMapping.cs index 8a9fa940dd..86a33b64c4 100644 --- a/src/EFCore.PG.NTS/Storage/Internal/NpgsqlGeometryTypeMapping.cs +++ b/src/EFCore.PG.NTS/Storage/Internal/NpgsqlGeometryTypeMapping.cs @@ -91,7 +91,7 @@ protected override string GenerateNonNullSqlLiteral(object value) } builder - .Append(geometry.AsText()) + .Append(new WKTWriter(4).Write(geometry)) .Append('\''); return builder.ToString(); diff --git a/src/EFCore.PG.NTS/Storage/Internal/NpgsqlJsonGeometryWktReaderWriter.cs b/src/EFCore.PG.NTS/Storage/Internal/NpgsqlJsonGeometryWktReaderWriter.cs index 4685aa0cec..bd51ab6ba9 100644 --- a/src/EFCore.PG.NTS/Storage/Internal/NpgsqlJsonGeometryWktReaderWriter.cs +++ b/src/EFCore.PG.NTS/Storage/Internal/NpgsqlJsonGeometryWktReaderWriter.cs @@ -30,7 +30,7 @@ public override Geometry FromJsonTyped(ref Utf8JsonReaderManager manager, object /// public override void ToJsonTyped(Utf8JsonWriter writer, Geometry value) { - var wkt = value.ToText(); + var wkt = new WKTWriter(4).Write(value); // If the SRID is defined, prefix the WKT with it (SRID=4326;POINT(-44.3 60.1)) // Although this is a PostgreSQL extension, NetTopologySuite supports it (see #3236) diff --git a/test/EFCore.PG.FunctionalTests/JsonTypesNpgsqlTest.cs b/test/EFCore.PG.FunctionalTests/JsonTypesNpgsqlTest.cs index 7ad9020e17..83cfece046 100644 --- a/test/EFCore.PG.FunctionalTests/JsonTypesNpgsqlTest.cs +++ b/test/EFCore.PG.FunctionalTests/JsonTypesNpgsqlTest.cs @@ -488,7 +488,7 @@ public override async Task Can_read_write_point_with_M() await Can_read_and_write_JSON_value( nameof(PointMType.PointM), factory.CreatePoint(new CoordinateM(2, 4, 6)), - """{"Prop":"SRID=4326;POINT (2 4)"}"""); + """{"Prop":"SRID=4326;POINT M(2 4 6)"}"""); } public override async Task Can_read_write_point_with_Z() @@ -508,7 +508,7 @@ public override async Task Can_read_write_point_with_Z_and_M() await Can_read_and_write_JSON_value( nameof(PointZMType.PointZM), factory.CreatePoint(new CoordinateZM(1, 2, 3, 4)), - """{"Prop":"SRID=4326;POINT Z(1 2 3)"}"""); + """{"Prop":"SRID=4326;POINT ZM(1 2 3 4)"}"""); } public override async Task Can_read_write_line_string() diff --git a/test/EFCore.PG.Tests/Storage/NpgsqlNetTopologySuiteTypeMappingTest.cs b/test/EFCore.PG.Tests/Storage/NpgsqlNetTopologySuiteTypeMappingTest.cs new file mode 100644 index 0000000000..07f67fd1c6 --- /dev/null +++ b/test/EFCore.PG.Tests/Storage/NpgsqlNetTopologySuiteTypeMappingTest.cs @@ -0,0 +1,32 @@ +using NetTopologySuite.Geometries; +using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal; + +namespace Npgsql.EntityFrameworkCore.PostgreSQL.Storage; + +public class NpgsqlNetTopologySuiteTypeMappingTest +{ + [Fact] + public void GenerateSqlLiteral_returns_point_literal() + => Assert.Equal( + "GEOMETRY 'POINT (1 2)'", + new NpgsqlGeometryTypeMapping("geometry", isGeography: false).GenerateSqlLiteral(new Point(1, 2))); + + [Fact] + public void GenerateSqlLiteral_returns_point_literal_with_Z() + => Assert.Equal( + "GEOMETRY 'POINT Z(1 2 3)'", + new NpgsqlGeometryTypeMapping("geometry", isGeography: false).GenerateSqlLiteral(new Point(new CoordinateZ(1, 2, 3)))); + + [Fact] // #4093 + public void GenerateSqlLiteral_returns_point_literal_with_M() + => Assert.Equal( + "GEOMETRY 'POINT M(1 2 4)'", + new NpgsqlGeometryTypeMapping("geometry", isGeography: false).GenerateSqlLiteral(new Point(new CoordinateM(1, 2, 4)))); + + [Fact] // #4093 + public void GenerateSqlLiteral_returns_point_literal_with_Z_and_M() + => Assert.Equal( + "GEOGRAPHY 'SRID=4326;POINT ZM(1 2 3 4)'", + new NpgsqlGeometryTypeMapping("geography", isGeography: true).GenerateSqlLiteral( + new Point(new CoordinateZM(1, 2, 3, 4)) { SRID = 4326 })); +}