这是一些代码以及我基于在 LINQPad 中玩耍的假设。谁能确认这是延迟加载的工作方式,并可能提供任何额外的见解/链接,以便我了解它在后端是如何工作的?提前致谢!
// Step 1.
var record = context.MyTable.First();
// Step 2.
var foreignKey = ForeignKeyTable.Where(x => x.Id == record.ForeignKeyId).Single();
// Step 3.
var entry = context.Entry(record);
// Step 4.
trace(entry.Reference(x => x.ForeignKey).IsLoaded);
// Step 5.
trace(record.ForeignKey.SomeProperty);
- 检索一些记录(查询数据库)。
- 检索恰好是外键属性的记录,
record
而无需使用延迟加载record.ForeignKey
来检索它(查询数据库)。 - 获取
record
实体的详细信息。 - 这是我不确定的部分。在我的测试中,它输出
true
. 我猜 IsLoaded 不知道record.ForeignKey
当前是否有一个值,但知道它record.ForeignKey
已经根据它的知识record.ForeignKeyId
和已建立的关系在上下文中被跟踪。 - db 似乎没有在这里被击中,我假设它出于同样的原因
IsLoaded
在 4 中返回 true。它知道它foreignKey
已经在跟踪对象,所以它知道它不必进行延迟加载。
编辑:我试图解决的实际问题可以这样说明:
var record = context.MyTable.First();
var foreignKey = new ForeignKey() { Id = record.ForeignKeyId, SomeProperty = 5 };
context.ForeignKeyTable.Attach(foreignKey);
var entry = context.Entry(record);
// Returns false.
trace(entry.Reference(x => x.ForeignKey).IsLoaded);
// Doesn't query for ForeignKey, so it must know it's `loaded` somehow, and
// gets SomeProperty from my new foreignKey object. What???
trace(record.ForeignKey.SomeProperty);