UseAzureSql at 170: Contains over a list inside a JSON collection applies JSON_CONTAINS to an nvarchar(max) fragment (error 8116)
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Ambito
- backend-api-design, databases
Direzione di ricerca
Start by tracing the SQL Server provider translation for Contains over primitive collections nested in JSON collections, especially the OPENJSON and JSON_CONTAINS paths affected by Azure SQL compatibility level 170. Compare the generated SQL for UseAzureSql and UseSqlServer, then add or find a regression test for the supplied model and query. Done means the query works on both provider configurations without errors 8116 or 13618.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Bug description
With UseAzureSql at compatibility level 170, Contains over a primitive collection inside a JSON-mapped collection fails:
Microsoft.Data.SqlClient.SqlException (0x80131904): Argument data type nvarchar(max) is invalid for argument 1 of json_contains function.
This looks like an interaction between two changes:
- The Azure SQL fix for #38615 (PR #38665): with
UseAzureSql, the nested fragment inOPENJSON ... WITHis declarednvarchar(max) ... AS JSONinstead ofjson ... AS JSON. - The
JSON_CONTAINStranslation (#36656 / #37562): it is then applied to that fragment.JSON_CONTAINSonly accepts thejsontype as its first argument.
Generated SQL with UseAzureSql:
WHERE EXISTS (
SELECT 1
FROM OPENJSON([b].[Details], '$.Tags') WITH ([Names] nvarchar(max) '$.Names' AS JSON) AS [t]
WHERE JSON_CONTAINS([t].[Names], N'a') = 1)
With UseSqlServer the fragment is declared json and the query works on SQL Server 2025. On Azure SQL Database, though, that form is the one #38615 fixed (error 13618). So on Azure SQL at level 170 this query shape fails with either provider configuration.
Possible fixes: keep the OPENJSON translation for Contains over a fragment that was declared nvarchar(max), or wrap the fragment in CAST(... AS json) before JSON_CONTAINS. JSON_CONTAINS(CAST(JSON_QUERY(...) AS json), ...) works on both SQL Server 2025 and Azure SQL.
Your code
// dotnet run repro.cs -- "<connection string to an empty database on SQL Server 2025 or Azure SQL Database>"
#:property PublishAot=false
#:package [email protected]
using Microsoft.EntityFrameworkCore;
var options = new DbContextOptionsBuilder<BlogContext>()
.UseAzureSql(args[0], o => o.UseCompatibilityLevel(170))
.Options;
await using var context = new BlogContext(options);
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();
context.Blogs.Add(new Blog { Details = new Details { Tags = [new Tag { Names = ["a"] }] } });
await context.SaveChangesAsync();
// FAIL: Argument data type nvarchar(max) is invalid for argument 1 of json_contains function.
await context.Blogs.CountAsync(b => b.Details.Tags.Any(t => t.Names.Contains("a")));
public class Blog
{
public int Id { get; set; }
public Details Details { get; set; } = new();
}
public class Details
{
public List<Tag> Tags { get; set; } = [];
}
public class Tag
{
public List<string> Names { get; set; } = [];
}
public class BlogContext(DbContextOptions<BlogContext> options) : DbContext(options)
{
public DbSet<Blog> Blogs => Set<Blog>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
=> modelBuilder.Entity<Blog>().OwnsOne(b => b.Details, d =>
{
d.ToJson();
d.OwnsMany(x => x.Tags);
});
}
Stack traces
Microsoft.Data.SqlClient.SqlException (0x80131904): Argument data type nvarchar(max) is invalid for argument 1 of json_contains function.
Error Number:8116,State:1,Class:16
EF Core version
11.0.0
Database provider
Microsoft.EntityFrameworkCore.SqlServer 11.0.0 (UseAzureSql). Reproduced on SQL Server 2025 (17.0.4025.3); the same JSON_CONTAINS argument check applies on Azure SQL Database.
Target framework
.NET 11.0
Operating system
Windows 11
IDE
No response
- Lingua principale
- C#
- Stelle
- 14.8k
- Fork
- 3.4k
- Merge medio
- 3g 18h
- PR unite (30g)
- 159
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di dotnet/efcore
-
customer-reported
Difficoltà 4/5 3-5 giorni Idoneità per principianti 54/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
I maintainer di solito rispondono entro 2 giorni
-
Regression in 11.0: replacing an owned instance or re-adding an entity with the same key sets unchanged OnAdd properties to nullForse già presa @seragAhmed l’ha presa oggi. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
dotnet/efcore#39617 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
customer-reported
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
I maintainer di solito rispondono entro 2 giorni
-
customer-reported
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di dotnet/efcore
Issue simili
-
bug emitter:client:csharp
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
microsoft/typespec#12572 · 1 commento · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
needs-area-label
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 2 giorni
-
AWS Lambda: KeyNotFoundException drops HTTP-triggered transactions when allowAllHeaders is disabledApertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
newrelic/newrelic-dotnet-agent#3949 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
area-networking
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
dotnet/aspnetcore#70545 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 87/100
I maintainer di solito rispondono entro 1 giorno