实体框架核心扁平子对象未使用SetValues更新

使用Entity Framework for .NET Core,我正在使用以下配置在根目录中提升一个子属性:

private void ConfigureEntityMappings(ModelBuilder builder) 
{
  builder.Entity<RootObject>().ToTable("root").HasKey(e => e.userId);
  builder.Entity<RootObjecct>(table =>
            {
                table.OwnsOne(
                    x => x.meta,meta =>
                    {
                        meta.Property(x => x.id).HasColumnName("meta_id");
                    });
            });
}

这是一个完全断开的方案,因此需要保存它而不是原始对象。如果密钥不存在,我想插入或更新。请注意,这是一种通用方法,因此我不明确地预先知道类型

public async Task<T> SaveItem(T updatedItem)
{
  var existing = ctx.Entry(updatedItem);
  var primaryKeyFieldName = existing.Context.Model.FindEntityType(entity.GetType()).FindPrimaryKey().Properties.Select(x => x.Name).Single();
  var primaryKeyField = entity.GetType().GetProperty(primaryKeyFieldName);
  var value = primaryKeyField.Getvalue(entity);
  var tracked = ctx.Find(entity.GetType(),value);

  if(tracked != null)
  {
    ctx.Entry(tracked).Currentvalues.Setvalues(updatedItem);
    // the meta.id property here remains unchanged
    ctx.Update(tracked);
  } 
  else
  {
    ctx.Add(updatedItem);
  }
}

如果我显式设置了子对象,则一切正常。问题是我该如何向EF发出我也关心跟踪元对象的信号,或者更好的是,I'll tell you if it's an update and just do an update on all properties 对类型的所有属性进行迭代感觉很麻烦。 N.B,这只是演示代码,我会将反射结果缓存为生产代码。

-编辑

查看从中返回的结果

            var names = wrapped.Properties
                        .Select(x => x.Metadata.Name)
                        .ToArray();

我根本看不到子资产。看来这可能是问题所在,我注意到meta属性由字段_meta支持,但是我不确定将hasField配置保留在哪里。

inlove2100 回答:实体框架核心扁平子对象未使用SetValues更新

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3163076.html

大家都在问