属性包含相关对象的子集

本文关键字:子集 对象 包含相 属性 | 更新日期: 2023-09-27 18:06:38

我有一个实体Post,它与Comment是一对多关系。我想让属性只返回它们的某个子集:

public class Post
{
    public virtual ICollection<Comment> Comments { get; set; }
    public virtual ICollection<Comment> TopLevelComments
    {
        get
        {
            return Comments.Where(c => c.ParentID == null).ToList();
        }
    }
}
然而,这段代码抛出

ArgumentNullException: Value不能为空。参数名称:source

这个答案似乎表明,这是因为我过滤Comments,而它仍然是null。但是,在使用此方法时,我确实会急切地加载它:

var post = await _context.Post.Include(m => m.Author).Include(m => m.Comments).ThenInclude(m => m.Author).SingleOrDefaultAsync(m => m.PostID == id);

我怎样才能使它工作?这是正确的做法吗?

属性包含相关对象的子集

首先,要避免这种异常,您需要在空实体的构造函数中初始化集合属性:

public Post()
{
  Comment=new List<Comment>();
}

第二件事是使用ThenInclude建议我你使用EF Core。如果是这种情况,你必须使用即时加载,因为这个版本的EF不支持延迟加载。

第三件事是TopLevelComments属性不应该映射为你的模型的一部分:

 modelBuilder.Entity<Post>()
                .Ignore(b => b.TopLevelComments);