diff --git a/src/EFCore.SqlServer/Storage/Internal/SqlServerStringTypeMapping.cs b/src/EFCore.SqlServer/Storage/Internal/SqlServerStringTypeMapping.cs index f28f1d15523..485d0d21e23 100644 --- a/src/EFCore.SqlServer/Storage/Internal/SqlServerStringTypeMapping.cs +++ b/src/EFCore.SqlServer/Storage/Internal/SqlServerStringTypeMapping.cs @@ -110,7 +110,9 @@ protected SqlServerStringTypeMapping(RelationalTypeMappingParameters parameters, _maxSize = AnsiMax; } - _isUtf16 = parameters.Unicode && parameters.StoreType.StartsWith("n", StringComparison.OrdinalIgnoreCase); + _isUtf16 = parameters.Unicode + && (parameters.StoreType.StartsWith("n", StringComparison.OrdinalIgnoreCase) + || parameters.StoreType.StartsWith("xml", StringComparison.OrdinalIgnoreCase)); _sqlDbType = sqlDbType; } diff --git a/test/EFCore.SqlServer.Tests/Storage/SqlServerStringTypeMappingTest.cs b/test/EFCore.SqlServer.Tests/Storage/SqlServerStringTypeMappingTest.cs index 41db30f7291..24f909921d0 100644 --- a/test/EFCore.SqlServer.Tests/Storage/SqlServerStringTypeMappingTest.cs +++ b/test/EFCore.SqlServer.Tests/Storage/SqlServerStringTypeMappingTest.cs @@ -37,4 +37,14 @@ public void GenerateProviderValueSqlLiteral_works_unicode(string value, string e var mapping = new SqlServerStringTypeMapping("nvarchar(max)", unicode: true); Assert.Equal(expected, mapping.GenerateProviderValueSqlLiteral(value)); } + + [Theory, InlineData("", "N''"), InlineData("it", "N'it'"), InlineData("I'm", "N'I''m'"), + InlineData("", "N''"), + InlineData("\n", "nchar(10)"), + InlineData("it\n", "CONCAT(CAST(N'it' AS nvarchar(max)), nchar(10))")] + public void GenerateProviderValueSqlLiteral_works_xml(string value, string expected) + { + var mapping = new SqlServerStringTypeMapping("xml", unicode: true, storeTypePostfix: StoreTypePostfix.None); + Assert.Equal(expected, mapping.GenerateProviderValueSqlLiteral(value)); + } }