Entity framework core 使用Entity.CurrentValues.SetValues更新导航属性

Entity framework core 使用Entity.CurrentValues.SetValues更新导航属性,entity-framework-core,npgsql,ef-core-3.1,Entity Framework Core,Npgsql,Ef Core 3.1,我有一个Kalem实体,它有一个DigerKalemMaliyetleri属性的集合,它是MaliyetBirimi对象的集合。DigerKalemMaliyetleri属于JSON类型,与JSON列存储在同一个表中 public class Kalem { public int Id { get; set; } [Column(TypeName = "json")] public ICollection<MaliyetBirimi> Di

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

public class Kalem
{
    public int Id { get; set; }
    [Column(TypeName = "json")]
    public ICollection<MaliyetBirimi> DigerKalemMaliyetleri { get; set; }
}
当我尝试更新仅更改DigerKalemmaliyettleri属性的实体时:

DataContext.Entry(第一个).CurrentValues.SetValues(第二个)

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

如何在不显式设置DigerKaleMaliyetleri属性的情况下更新实体


关于

如果没有完整的代码示例,很难准确地知道您在做什么。还请注意,您正试图从
second
设置
first
的所有属性,包括可能不是您想要的Id

下面是一个对我有用的完整代码示例:

wait使用(var ctx=new BlogContext())
{
等待ctx.Database.EnsureDeletedAsync();
等待ctx.Database.EnsureCreatedAsync();
ctx.Kalem.Add(新的()
{
DigerKalemMaliyetleri=新列表()
{
new(){DovizCinsi=1,Maliyet=2}
}
});
等待ctx.saveChangesSync();
}
等待使用(var ctx=new BlogContext())
{
var first=ctx.Kalem.Find(1);
var second=新卡莱姆
{
DigerKalemMaliyetleri=新列表()
{
new(){DovizCinsi=3,Maliyet=4}
}
};
Entry(first).Property(k=>k.DigerKalemMaliyetleri).CurrentValue=second.DigerKalemMaliyetleri;
等待ctx.saveChangesSync();
}
公共类BlogContext:DbContext
{
公共DbSet Kalem{get;set;}
静态iLogger工厂上下文Logger工厂
=>LoggerFactory.Create(b=>b.AddConsole().AddFilter(“,LogLevel.Information));
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
=>选项生成器
.UseNpgsql(@“主机=本地主机;用户名=测试;密码=测试”)
.EnableSensitiveDataLogging()
.UseLoggerFactory(ContextLoggerFactory);
}
公共级Kalem
{
公共int Id{get;set;}
[列(TypeName=“json”)]
公共ICollection DigerKalemMaliyetleri{get;set;}
}
公共级MaliyetBirimi
{
公共int?dovizinsi{get;set;}
公共十进制数{get;set;}
}

我也遇到了同样的问题,您不能实际使用SetValues来更新导航属性,您需要使用
DataContext.update(YourNewObj)
然后使用
DataContext.SaveChanges()如果要使用设置值方法,需要:

-获取exist条目

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循环之前,您还可以检查是否需要加载导航,否则会出现错误。 如果你看到更好的情况,请纠正我

DataContext.SaveChanges();