これは、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);
- いくつかのレコードを取得します (DB が照会されます)。
- たまたま の外部キー プロパティであるレコードを取得する
record
ように遅延読み込みを使用せずrecord.ForeignKey
に取得します (DB がクエリされます)。 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);