使用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
配置保留在哪里。