EF Core 正在更新实体 属性,类型为 JSON
EF Core Updating Entity Property with JSON Type
我有一个 Parent 和 Child 的一对多关系来存储一些数据。我想使用 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
我有一个 Parent 和 Child 的一对多关系来存储一些数据。我想使用 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