私はEntity Frameworkを初めて使用しており、コードファーストを使用してデータベースからエンティティを読み込む方法を学習しようとしています。Entity Frameworkコードでの関連するエンティティの循環的な読み込みを防止する方法
public class AuditEntry
{
public int AuditEntryID { get; set; }
[Required]
public string Message { get; set; }
// Navigation Properties
public int UserID { get; set; }
public virtual User User { get; set; }
}
私はDBContext持ってちょうど2つを公開:
public class User
{
public int UserID { get; set; }
[Required]
public string Name { get; set; }
// Navigation Properties
public virtual ICollection<AuditEntry> AuditEntries { get; set; }
}
が
各ユーザーは、簡単なメッセージが含まれているそれぞれの監査エントリのセットを持つことができます。
私のモデルは、ユーザが含まれていますテーブル:
public DbSet<User> Users { get; set; }
public DbSet<AuditEntry> AuditEntries { get; set; }
私がしたいのは、混乱を含むAuditEntryオブジェクトのリストをロードすることです年齢と、UserIDおよびNameプロパティを含む関連するUserオブジェクト。
List<AuditEntry> auditEntries = db.AuditEntries.ToList();
は、私は私のナビゲーションプロパティは、仮想としてマークされ、私は無限に深いオブジェクトグラフを取得し、遅延ロードを無効にしていない持っているので(各AuditEntryは、それぞれのAuditEntriesのリストが含まれているユーザーオブジェクトを、持っていますAuditEntriesなどのリストを含むUserオブジェクトが含まれています)
オブジェクトをシリアル化したい場合(Web APIの結果として送信する場合など)、これはうまくいかないでしょう。
モデルのナビゲーションプロパティから仮想キーワードを削除するか、this.Configuration.LazyLoadingEnabled = false;をDBContextに追加して、遅延読み込みを無効にしました。期待どおり、この結果、ユーザーがnullに設定されたAuditEntryオブジェクトのフラットなリストが生成されます。遅延ロードオフで
、私は熱心な負荷にそのようなユーザー試してみた:
var auditentries = db.AuditEntries.Include(a => a.User);
が、これは、以前と同じ深さ/巡回結果になります。
逆参照/後続のナビゲーションプロパティを元のオブジェクトに戻してサイクルを作成することなく、1レベル深く読み込むことができます(ユーザーのIDと名前を含めるなど)。 (内部的に)これは生産
public dynamic GetAuditEntries()
{
var result = from a in db.AuditEntries
select new
{
a.AuditEntryID,
a.Message,
User = new
{
a.User.UserID,
a.User.Username
}
};
return result;
}
賢明なようだ、次のSQL:
'Include'はちょうどそれを行う必要があります。あなたは 'User.AuditEntries'が遅延読み込みではないと確信していますか? –
コンテキストが破棄された後にオブジェクトをシリアル化するとどうなりますか? –
私は最初は思っていましたが、それは怠惰な読み込みではないと思いました。すべてのナビゲーションプロパティから仮想キーワードを削除して、レイジーローディングを明示的に無効にすることは役に立ちません。 ナビゲーションのプロパティが両方向にあるためですユーザーにはAuditEntriesのリストがあり、AuditEntriesはそれが属するユーザーを定義します。私はAuditEntriesを照会してユーザー情報を含める必要がありますが、すべての最上位のAuditEntryオブジェクトに、そのユーザーの他のすべてのAuditEntriesのリストを含める必要はありません。 私は何が起こっているのか説明するのに苦労しているので、それは難しいです! –