Cannot set an owned, nullable JSON collection from empty to null
- Dominant language
- C#
- Stars
- 14.8k
- Forks
- 3.4k
- PR merge metrics
- PR metrics pending
Description
I have an entity with an owned, nullable JSON collection (see [NullVsEmptyList.zip](https://github.com/dotnet/efcore/files/14826830/NullVsEmptyList.zip) for a running example):
```C#
class ParentEntity
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
public List? Children { get; set; }
}
class ChildEntity
{
public string Name { get; set; } = "";
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity().OwnsMany(p => p.Children, builder => builder.ToJson());
}
```
Once `Children` is persisted as `[]`, I cannot set it to `null`.
```C#
//insert entity
using (MyContext context = new())
{
ParentEntity parent = new()
{
Id = id,
Name = "A",
Children = [] //set Children to empty list
};
context.Parents.Add(parent);
await context.SaveChangesAsync();
}
//read and update entity
using (MyContext context = new())
{
var parent = await context.Parents.FindAsync(id);
parent!.Name = "B";
parent.Children = null; //set Children to null;
await context.SaveChangesAsync(); //SQL update statement doesn't update parent.Children
}
```
Here's the generated SQL update statement:
```SQL
UPDATE "Parents" SET "Name" = @p0
WHERE "Id" = @p1
RETURNING 1;
```
It seems to me like the change tracking doesn't recognize the change from `[]` to `null` as a relevant change. If I understand #31831 correctly, `[]` and `null` should be considered distinct.
EF Core version: 8.0.3
Database provider: Microsoft.EntityFrameworkCore.Sqlite 8.0.3 (and Npgsql.EntityFrameworkCore.PostgreSQL 8.0.2)
Target framework: net8.0
IDE: Visual Studio 2022 17.9.5
Contributor guide
Assessment
This issue has not been assessed yet.