2016-09-26 82 views
0

你好,我有EntityFramework的問題。我有一對多的關係。實體框架不從相關的表中取數據

public class Question 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public string Description { get; set; } 

    [Required] 
    public DateTime AddDate { get; set; } 

    [Required] 
    public string Author { get; set; } 

    [Required] 
    public bool IsApproved { get; set; } = false; 

    public ICollection<Answer> Answers { get; set; } 
} 

和謝勝利類:

public class Answer 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Text { get; set; } 
    [Required] 
    public string FileName { get; set; } 

    public Question Question { get; set; } 
} 

如何,我們可以看到我設置這些表之間的關係。 可惜的是,當我做簡單的選擇

_context.Question.OrderByDescending(x => x.AddDate).Take(10) 

答案對象始終是零。 我在MSSQL中檢查了Keys。問題表沒有任何FK給答案,但答案有FK給問題。

有人能爲我解釋我做錯了什麼嗎?爲什麼FK沒有創建? 我正在嘗試虛擬類型,但它沒有幫助。

+1

只是一個猜測:通常你必須使屬性虛擬來啓用延遲加載,或者你必須使用急切的加載(包括加載它們時所需的相關對象), 例如在你的情況下(急於加載:) '_context.Question.OrderByDescending(x => x.AddDate).Include(x => x.Answers).Take(10)' –

+1

FK正是它應該在的地方 - 在'many'一側。所以關係是可以的,但不會自動填充。在查詢中插入'.Include(x => x.Answers)''。參考:[加載相關實體](https://msdn.microsoft.com/en-us/data/jj574232.aspx) –

回答

1

Question表中不應該有任何FK,因爲FK的shadow屬性僅在Answer對象關係的'many'側創建。

你,基本上有two options

  1. 顯式加載回答:

    var questions = _context.Question.OrderByDescending(x => x.AddDate).Take(10); 
    _contest.Answer.Where(x => questions.Select(q => q.Id) 
              .Contains(EF.Property<int>(x, "QuestionId"))).Load(); 
    

這是一個有點令人費解的語句所有的答案將與合適的對象來填充後。請注意FK使用自動創建的陰影屬性。更多關於命名約定here

  • 遠更容易地將熱切加載集合:

    _context.Question.OrderByDescending(x => x.AddDate).Take(10).Include(x => x.Answers); 
    
  • 這是更爲有效的,只是普通可讀和簡潔的代碼,在我意見。

    另外,值得注意的是EF Core does not support lazy loading截至此刻。

    相關問題