2015-09-04 52 views
1

我正在使用EF7 beta 7.我有几个论坛样式表,它们之间有一个导航属性,以及在上下文的OnModelCreating方法中设置的关系:包括不包括导航属性,除非ToList被调用

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 s。我已经检查了Sql Profiler,并确认它只运行选择获得Forum的选项,并且没有第二选择Topic的选项。

如果我的Select之前调用ToList这样

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

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

+0

我还没有EF7工作,只有6所以也许它改变,但不会将您的导航属性必须'virtual'为了支持急切和懒惰加载? – dman2306

+0

@ dman2306我只是试图让它们变成'虚拟'而没有改变。我不认为在EF 6中这是必需的... –

回答

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>() 
+0

其他SO帖子非常棒,谢谢,但它似乎没有帮助。我已经添加了关系并初始化了集合,我仍然得到相同的结果(尽管是一个空集合而不是NRE)。我已将相关更改编辑到问题中。 –

+0

你知道什么,它看起来像关系正在工作,它的预测不是......我要为此提出一个新问题。谢谢。 –