C# 除非调用ToList,否则不包括导航属性

C# 除非调用ToList,否则不包括导航属性,c#,entity-framework-core,C#,Entity Framework Core,我正在使用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>();

我正在使用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);
    }
}
当我按原样运行时,我得到了一个
ArgumentNullException
我得到了一个空集合,因为它实际上似乎并不急于加载
主题。我已经签入了
sqlprofiler
,并确认它只运行select来获取
论坛
,没有第二次选择
主题

如果我在
之前调用
ToList
,请选择这样的

var forums = _context.Forums.Include(f => f.Topics)
                            .ToList()
                            .Select(f => new 
                                {
                                    f.Title,
                                    f.ForumId,
                                    f.Topics.Count
                                });

它将包括
主题
和代码运行,但是,这与目的背道而驰,因为这会导致它枚举包含所有主题的所有论坛,然后计数,而不是在数据库上运行
计数
。这是
Include
的错误,还是我使用的
Include
错误?

您需要配置主题和论坛之间的关系,以便
。Include
正常工作

class YourContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
          // configure the relationship here
    }
}
有关使用集合的更多提示,请参阅

另一个音符

通过在
.Include(…)
之后立即调用
.ToList()
,您将强制进行早期评估。
.Select(…)
中的以下投影在客户端的内存中运行,而不是使用EF7的查询管道

另外,确保在POCO定义中添加初始值设定项

public ICollection<Topic> Topics { get; set; } = new List<Topic>()
public ICollection主题{get;set;}=new List()

我没有使用EF7,只有6个,所以它可能会更改,但是您的导航属性是否需要是
虚拟的
,以支持即时加载和延迟加载?@dman2306我只是尝试将它们设置为
虚拟的
,并且没有更改。我认为EF6中也不需要这样做……那个其他的SO帖子很好,谢谢,但似乎没有什么帮助。我添加了一个关系并初始化了集合,但仍然得到了相同的结果(尽管是一个空集合而不是NRE)。我已经把相关的变化编辑到问题中了。你知道吗,看起来关系在起作用,是预测没有。。。我要问一个新问题。谢谢
public ICollection<Topic> Topics { get; set; } = new List<Topic>()