diff --git a/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlArrayTypeMapping.cs b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlArrayTypeMapping.cs index 4bae5b1402..5e2464e3ba 100644 --- a/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlArrayTypeMapping.cs +++ b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlArrayTypeMapping.cs @@ -145,7 +145,7 @@ private static RelationalTypeMappingParameters CreateParameters(string storeType if (elementJsonReaderWriter is not null && !typeof(TElement).UnwrapNullableType().IsAssignableTo(elementJsonReaderWriter.ValueType)) { throw new InvalidOperationException( - $"When building an array mapping over '{typeof(TElement).Name}', the JsonValueReaderWriter for element mapping '{elementMapping.GetType().Name}' is incorrect ('{elementJsonReaderWriter.ValueType.GetType().Name}' instead of '{typeof(TElement).UnwrapNullableType()}', the JsonValueReaderWriter is '{elementJsonReaderWriter.GetType().Name}')."); + $"When building an array mapping over '{typeof(TElement).Name}', the JsonValueReaderWriter for element mapping '{elementMapping.GetType().Name}' is incorrect ('{elementJsonReaderWriter.ValueType.Name}' instead of '{typeof(TElement).UnwrapNullableType()}', the JsonValueReaderWriter is '{elementJsonReaderWriter.GetType().Name}')."); } // If there's no JsonValueReaderWriter on the element, we also don't set one on its array (this is for rare edge cases such as diff --git a/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlJsonTypeMapping.cs b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlJsonTypeMapping.cs index 151e088fc8..9e32d55754 100644 --- a/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlJsonTypeMapping.cs +++ b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlJsonTypeMapping.cs @@ -32,7 +32,7 @@ public NpgsqlJsonTypeMapping(string storeType, Type clrType, CoreTypeMapping? el storeType, clrType, storeType == "jsonb" ? NpgsqlDbType.Jsonb : NpgsqlDbType.Json, - jsonValueReaderWriter: JsonStringReaderWriter.Instance, + jsonValueReaderWriter: clrType == typeof(string) ? JsonStringReaderWriter.Instance : null, elementTypeMapping: elementTypeMapping) { if (storeType != "json" && storeType != "jsonb") diff --git a/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs b/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs index d31012889d..b1ec3c98b5 100644 --- a/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs +++ b/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs @@ -1,12 +1,12 @@ using System.Net; using System.Net.NetworkInformation; +using System.Text.Json; using Microsoft.EntityFrameworkCore.Storage.Json; using NetTopologySuite.Geometries; using Npgsql.EntityFrameworkCore.PostgreSQL.Infrastructure; using Npgsql.EntityFrameworkCore.PostgreSQL.Internal; using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal; using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping; -using Npgsql.EntityFrameworkCore.PostgreSQL.TestUtilities; namespace Npgsql.EntityFrameworkCore.PostgreSQL.Storage; @@ -313,6 +313,20 @@ public void Json_primitive_collection() Assert.Same(typeof(int), elementMapping.ClrType); } + [Theory] + [InlineData(typeof(JsonDocument[]))] + [InlineData(typeof(List))] + [InlineData(typeof(JsonElement[]))] + [InlineData(typeof(List))] + public void Array_of_json_type(Type clrType) + { + var mapping = CreateTypeMappingSource().FindMapping(clrType); + Assert.NotNull(mapping); + var arrayMapping = Assert.IsType(mapping, exactMatch: false); + Assert.Equal("jsonb[]", arrayMapping.StoreType); + Assert.Same(clrType, arrayMapping.ClrType); + } + #endregion JSON #region Multirange