实体框架:获取子对象
本文关键字:对象 获取 框架 实体 | 更新日期: 2023-09-27 18:27:28
我有以下实体类:
public class History : BaseEntity
{
public string Version { get; set; }
public DateTime? ReleaseDate { get; set; }
public string Name { get; set; }
public string Additional { get; set; }
public List<HistoryEntry> Entries { get; set; }
}
public class HistoryEntry : BaseEntity
{
public string Version { get; set; }
public string BugNr { get; set; }
public AllowedTypes EntryType { get; set; }
public string Description { get; set; }
public History Parent { get; set; }
}
public enum AllowedTypes
{
Bug, Enhancement
}
它们是这样映射的:
public HistoryMap()
{
ToTable("History");
HasKey(c => c.Version);
Property(c => c.Version).HasMaxLength(10);
Property(c => c.Name).HasMaxLength(200);
}
这导致了两个表的行为与我想要的完全一样("History"有"Version"作为主键,"HistoryEntry"有一个外键"Version"链接到"History)。"Version"
在向这些表中添加一些内容后,我尝试阅读内容:
IQueryable<History> query = _historyRepository.Table.OrderByDescending(c => c.ReleaseDate);
var historyList = new List<Core.Domain.Tengo.History>(query);
当成功读取所有历史条目时,如果"History"-对象始终为NULL,则"Entries"-属性。
如何实现链接的项目也被读取并存储到条目中?
导航属性(如ICollection<T>
/IList<T>
)应标记为virtual
。这允许EntityFramework覆盖它们,并提供延迟加载属性的代码。
因此,线路(在History
类中)
public List<HistoryEntry> Entries { get; set; }
应成为
public virtual List<HistoryEntry> Entries { get; set; }
Yves的答案是正确的,如果您想使用Lazy Loading。
另一种方法是使用Eager Loading。急切加载会立即加载属性,而不是在访问时加载。下面的片段使用了Eager Loading。
_historyRepository.Table.Include(x=>x.Entries).OrderByDescending(c => c.ReleaseDate);
懒惰和渴望加载之间的区别在下面的链接中解释:
http://www.dotnet-tricks.com/Tutorial/entityframework/RIWW210913-Difference-between-Lazy-Loading-and-Eager-Loading.html