属性包含相关对象的子集
本文关键字:子集 对象 包含相 属性 | 更新日期: 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);