包含相关对象子集的属性

时间:2016-09-12 19:07:28

标签: c# asp.net-mvc entity-framework linq linq-to-entities

我有实体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:值不能为null。参数名称:source

This answer似乎表明这是因为我在Comments仍在null时过滤了var post = await _context.Post.Include(m => m.Author).Include(m => m.Comments).ThenInclude(m => m.Author).SingleOrDefaultAsync(m => m.PostID == id); 。但是,在使用此方法的操作中,我急切地加载它:

new JLabel().setIcon()

我怎样才能让它发挥作用?这是否是正确的方法?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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