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));
+ }
}