首页 > 解决方案 > 使用 Entity.CurrentValues.SetValues 更新导航属性

问题描述

我有一个带有DigerKalemMaliyetleri属性集合的Kalem实体,它是 MaliyetBirimi 对象的集合。DigerKalemMaliyetleri 是 JSON 类型,与 JSON 列存储在同一个表中。

public class Kalem
{
    public int Id { get; set; }
    [Column(TypeName = "json")]
    public ICollection<MaliyetBirimi> DigerKalemMaliyetleri { get; set; }
}
public class MaliyetBirimi
{
    public int? DovizCinsi { get; set; }
    public decimal? Maliyet { get; set; }
}

当我尝试更新仅更改 DigerKalemMaliyetleri 属性的实体时:

DataContext.Entry<Kalem>(first).CurrentValues.SetValues(second);

SQL Update 命令未执行,数据库记录未更新。

如何在不明确设置 DigerKalemMaliyetleri 属性的情况下更新实体?

问候

标签: entity-framework-corenpgsqlef-core-3.1

解决方案


我遇到了同样的问题,您实际上不能使用 SetValues 来更新导航属性,而是使用DataContext.Update(YourNewObj)and then DataContext.SaveChanges();或者如果您想使用 SetValues 方法,则需要:

- 获取存在的条目

Kalem existObj = DataContext.Kalems.Find(YourNewObj.Id);

-在更新条目导航和现有导航中循环设置更新条目的值:

foreach(var navObj in DataContext.Entry(YourNewObj).Navigations)
 {
   foreach(var navExist in DatatContext.Entry(existObj).Navigations)
    {
     if(navObj.Metadata.Name == navExist.MetaData.Name)
       navExist.CurrentValue = navObj.CurrentValue;
    }
 }

- 更新直接属性的变化:

DataContext.Entry(existObj).CurrentValues.SetValues(YourNewObj);

- 保存您的更新:

DataContext.SaveChanges();

您还可以在进入 foreach 循环之前检查是否需要加载导航,否则会出错。如果你看到更好的场景,请纠正我。


推荐阅读