【发布时间】:2013-05-21 15:22:03
【问题描述】:
我有一个可以包含许多部分的工作表。每个部分还可以包含许多部分。我想以尽可能少的往返数据库的方式加载工作表、其部分和所有子部分。实际上,我认为这通常是 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;
}
}
这将创建所需的表结构: 工作表:ID (pk), ... 部分:Id (pk)、SheetId(非空)、ParentId(空)
GetSheetConfiguration 方法加载与该工作表相关的所有部分,并让 EF 对其进行排序。它使关系正确,除了所有部分也在 Sheet.Sections 中。 (我想为每个部分设置 SheetId 以避免递归查询。)如何告诉 EF 在工作表级别仅使用 ParentId = null 的部分? - 列表项
【问题讨论】:
-
您为
GetSheetConfiguration发布的代码是否正确?我不明白(Sections.Where ... )这一行@ -
目的是加载该工作表的所有部分,然后让 EF 对其进行排序。正如@Slauma 建议的那样,说
Sections.Where(sect => sect.SheetId == id).Load();会更清楚
标签: c# .net ef-code-first entity-framework-5 code-first