2015-09-04 49 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

你知道什麼,它看起來像關係正在工作,它的預測不是......我要爲此提出一個新問題。謝謝。 –