【发布时间】:2011-12-15 20:02:13
【问题描述】:
这是一些代码以及我基于在 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);
【问题讨论】:
标签: c# .net entity-framework ef-code-first change-tracking