【发布时间】:2020-01-30 16:30:54
【问题描述】:
我想在插入后将对象层次结构添加到缓存中后,是否有办法触发对象层次结构的延迟加载。
如果我插入一个只为其提供外键 ID 的对象并尝试在之后立即请求它,则不会检索到这些属性/集合。
例子:
_dbContext.Set<MYTYPE>().Add(myObject);
await _dbContext.SaveChangesAsync(ct);
_dbContext.Entry(myObject).Collection(c => c.SomeCollection).Load();
_dbContext.Entry(myObject).Reference(c => c.Property1).Load();
_dbContext.Entry(myObject.Property1).Reference(c => c.NestedProperty).Load();
_dbContext.Entry(myObject).Reference(c => c.Property2).Load();
_dbContext.Entry(myObject).Collection(c => c.SomeCollection2).Load();
_dbContext.Entry(myObject).Reference(c => c.Property3).Load();
_dbContext.Entry(myObject).Reference(c => c.Property4).Load();
_dbContext.Entry(myObject.Property4).Reference(c => c.SomeOtherNestedProperty).Load();
_dbContext.Entry(myObject).Reference(c => c.Property5).Load();
_dbContext.Entry(myObject).Reference(c => c.Property6).Load();
return _dbContext.Set<MYTYPE>().Where(x => x.Id == myObject.Id);
除非我执行所有 Load()(有时必须嵌套到多个层中......),否则我无法正确延迟加载任何子属性。
注意:做
_dbContext.Entry(myObject).Reload()
或
_dbContext.Entry(myObject).State = EntityState.Detached;
没用。
有什么想法吗?因为我有几个这样的案例,使用 HEAVY 对象嵌套,不得不手动完成所有负载感觉真的很糟糕。
谢谢。
【问题讨论】:
-
那为什么不尝试不延迟加载呢?急切加载不是一种选择?
-
问题是它有我在缓存中添加的实体,所以无论我做什么它都不会在没有显式加载的情况下加载其他属性。这没有任何意义,即使我使实体无效......
-
等等,这一切都是因为您在插入和保存之前将外键作为整数而不是链接整个对象,明白吗?我会发布一个答案来解释。
-
另外,我建议你看看这个问题的答案stackoverflow.com/questions/40729137/…
标签: entity-framework .net-core