实体框架:获取子对象

本文关键字:对象 获取 框架 实体 | 更新日期: 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