dotnet / dotnet/efcore

Cannot set an owned, nullable JSON collection from empty to null

Open
#33,452 4 comments 6 reactions 0 assignees View on GitHub
area-change-tracking area-json consider-for-next-release customer-reported
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.