我仍然为此付出了努力,为什么每个'Category'项都会返回null'Task'集合。我在数据库中有数据,我缺少什么?
public class ApplicationUser : IdentityUser
{
public ICollection<Category> Categories { get; set; }
}
public class Category
{
public int CategoryId { get; set; }
public string Name { get; set; }
public DateTime Timestamp { get; set; }
public ICollection<Task> Tasks { get; set; }
}
public class Task
{
public int TaskId { get; set; }
public string Name { get; set; }
public DateTime Timestamp { get; set; }
}
以下是查询:
public IEnumerable<Category> GetAllForUser(string name)
{
return _ctx.Users.Where(x => x.UserName == name)
.SelectMany(x => x.Categories)
.Include(x => x.Tasks).ToList();
}
答案 0 :(得分:3)
您的查询属于Ignored Includes案例:
如果更改查询以使其不再返回查询开头的实体类型的实例,则忽略包含运算符。
如链接中所述,如果您将以下内容添加到DbContext OnConfiguring
:
optionsBuilder.ConfigureWarnings(warnings => warnings.Throw(CoreEventId.IncludeIgnoredWarning));
然后代替null
集合,您将在错误消息中收到包含类似内容的InvalidOperationException
:
导航的包含操作:&#39; x.Tasks&#39;被忽略,因为在最终查询结果中无法访问目标导航。
那么如何解决这个问题呢?显然,要求是从要添加的实体开始查询。在您的情况下,您应该从_ctx.Categories
开始。但是为了应用相同的过滤器,您需要将Application.Users
的反向导航属性添加到Category
类:
public class Category
{
// ...
public ApplicationUser ApplicationUser { get; set; }
}
现在以下内容将起作用:
public IEnumerable<Category> GetAllForUser(string name)
{
return _ctx.Categories
.Where(c => c.ApplicationUser.UserName == name)
.Include(c => c.Tasks)
.ToList();
}
答案 1 :(得分:0)
试试这个:
public IEnumerable<Category> GetAllForUser(string name)
{
return _ctx.Users
.Include(u => u.Categories)
.Include(u => u.Categories.Select(c => c.Tasks))
.Where(x => x.UserName == name)
.SelectMany(x => x.Categories)
.ToList();
}
答案 2 :(得分:0)
public virtual ICollection<Task> Tasks { get; set; }