我使用的是EF7 beta 7.我有几个论坛样式表,它们之间有导航属性,以及在上下文的OnModelCreating
方法中设置的关系:
public class Forum
{
public int ForumId { get; set; }
public string Title { get; set; }
public ICollection<Topic> Topics { get; set; } = new List<Topic>();
}
public class Topic
{
public int TopicId { get; set; }
public string Title { get; set; }
public int ForumId { get; set; }
public Forum Forum { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Forum> Forums { get; set; }
public DbSet<Topic> Topics { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Forum>()
.Collection(f => f.Topics)
.InverseReference(t => t.Forum)
.ForeignKey(t => t.ForumId);
}
}
我试图获取Forum
的清单Topic
:
var forums = _context.Forums.Include(f => f.Topics)
.Select(f => new
{
f.Title,
f.ForumId,
f.Topics.Count
});
当我按原样运行时,我得到一个我得到一个空集合,因为它似乎并没有真正急切地加载ArgumentNullException
Topic
。我已检入Sql Profiler
并确认其仅运行选择以获取Forum
并且没有第二次选择Topic
&#39; s
如果我在ToList
之前致电Select
var forums = _context.Forums.Include(f => f.Topics)
.ToList()
.Select(f => new
{
f.Title,
f.ForumId,
f.Topics.Count
});
它将包含Topic
和代码运行,但是这会使目的失败,因为这会导致它枚举包含所有主题的所有论坛,而然后计数在数据库上运行Count
。这是Include
的错误,还是我使用Include
错误?
答案 0 :(得分:1)
您需要配置主题和论坛之间的关系才能使.Include
生效。
class YourContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// configure the relationship here
}
}
有关使用集合的更多提示,请参阅How to work with collections。
另一个注释
在.ToList()
之后立即致电.Include(...)
,您正在强制进行早期评估。 .Select(...)
中的以下投影在客户端内存中运行,而不是使用EF7的查询管道。
另外,请确保在POCO定义中添加初始化程序。
public ICollection<Topic> Topics { get; set; } = new List<Topic>()