Entity framework core 使用Entity.CurrentValues.SetValues更新导航属性
我有一个Kalem实体,它有一个DigerKalemMaliyetleri属性的集合,它是MaliyetBirimi对象的集合。DigerKalemMaliyetleri属于JSON类型,与JSON列存储在同一个表中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
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();