EF Core 正在更新实体 属性,类型为 JSON

EF Core Updating Entity Property with JSON Type

我有一个 ParentChild 的一对多关系来存储一些数据。我想使用 Npgsql.EntityFrameworkCore.PostgreSQL 包将这些数据存储在 PostgreSQL 中。 Parent 映射到 table,但 Child 存储为 Parentjson 列=42=] table 在数据库中。

public class Parent
{
    public int Id { get; set; }
    [Column(TypeName = "json")]
    public ICollection<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
}

当我尝试使用以下代码将子实体添加到现有父实例时,SaveChangesAsync 不会在数据库上生成更新命令。

var child = new Child(){Id = 0, Name = "Name"};
var parent = await DataContext.Parent.SingleOrDefaultAsync(f => f.Id == 1);
parent.Children.Add(child);

await DataContext.SaveChangesAsync();

为了触发更新命令,我必须在调用 SaveChangesAsync 之前将父实体的 State 设置为 Modified .

var entry = DataContext.Entry<Parent>(parent);
entry.State = EntityState.Modified;

这是预期的行为还是我遗漏了什么?

更新: 正如@SvyatoslavDanyliv 所建议的,当我使用从 List 并覆盖 Object.Equals 如下:

    public class EqualityCollection<T> : List<T>
    {
        public override bool Equals(object? obj)
        {
            if (obj != null && obj.GetType() == typeof(EqualityCollection<T>))
                return this.Equals(obj as EqualityCollection<T>);
            return false;
        }

        public bool Equals(EqualityCollection<T> obj)
        {
            return this.SequenceEqual(obj ?? throw new InvalidOperationException());
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    }

更改检测未检测到 属性 中的更改,并且未触发更新命令。

在通过 HasConversion 定义转换时,您必须定义 ValueComparer,如文档中所述:Value Comparers