entity-framework-core - 使用 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 属性的情况下更新实体?
问候
解决方案
我遇到了同样的问题,您实际上不能使用 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 循环之前检查是否需要加载导航,否则会出错。如果你看到更好的场景,请纠正我。
推荐阅读
- javascript - 将随机且不存在的项目从另一个数组添加到数组
- reactjs - 根据查询字符串参数初始化存储
- google-cloud-speech - 带有 FLAC 的 Google Cloud Speech Streaming API
- javascript - 自动导入具有相同文件后缀的模块
- isabelle - 从具体对象实例化一个类?
- python - Keras 1.2.2 和 Keras 2.2 预测的差异
- c# - ASP.NET Core Web API 中的自定义操作
- laravel - 当模型更新作为计划任务运行时,Laravel 自定义事件不会被 eloquent 事件触发
- sharepoint - 使用 Sharepoint 作为 QnA Maker 的源
- python - raw_input 没有正确返回