多くのセクションを含むことができるシートがあります。各セクションには、多くのセクションを含めることもできます。データベースへの往復をできるだけ少なくして、シート、そのセクション、およびすべてのサブセクションをロードしたいと考えています。実際には、これは通常 1 ~ 2 レベルの深さになると思いますが、最大で 16 レベルになる可能性もあります。コードは次のとおりです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
public class Sheet {
public long Id { get; set; }
// more fields
public virtual IList<Section> Sections { get; set; }
}
public class Section {
public long Id { get; set; }
public long SheetId { get; set; }
[ForeignKey("SheetId")]
public virtual Sheet Sheet { get; set; }
public long? ParentId { get; set; }
[ForeignKey("ParentId")]
public virtual Section Parent { get; set; }
public virtual IList<Section> Sections { get; set; }
// more fields
}
public class MyDbContext : DbContext {
public DbSet<Sheet> Sheets { get; set; }
public DbSet<Section> Sections { get; set; }
public Sheet GetSheetConfiguration(long id) {
Configuration.LazyLoadingEnabled = false;
Sheet rtn;
rtn = Sheets.Find(id);
(Sections.Where(sect => sect.SheetId == id)).ToList();
return rtn;
}
}
これにより、必要なテーブル構造が作成されます: Sheets: Id (pk), ... Sections: Id (pk), SheetId (not null), ParentId (null)
GetSheetConfiguration メソッドは、そのシートに関連するすべてのセクションを読み込み、EF に並べ替えさせます。すべてのセクションが Sheet.Sections にもあることを除いて、正しい関係が得られます。(再帰クエリを避けるために、すべてのセクションに SheetId を設定したかったのです。) シート レベルで ParentId = null のセクションのみを使用するように EF に指示するにはどうすればよいですか? - リスト項目