2012-03-14 42 views
0

我使用代碼先行先試延遲加載,車型如下,混淆延遲加載

class Team 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Boss { get; set; } 
     public string City { get; set; } 
     public List<Player> players { get; set; } 

     public Team() 
     { 
      players = new List<Player>(); 
     } 
    } 

    class Player 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public int Number { get; set; } 
     public int Age { get; set; } 
     public Team team { get; set; } 
    } 

和上下文喜歡這個,

class testContext : DbContext 
    { 
     public DbSet<Team> teamSet { get; set; } 
     public DbSet<Player> playerSet { get; set; } 
    } 

我讀茱莉亞·勒曼的著作「編程實體框架」,並與懶加載混淆。當我寫如下的代碼,

using (var context = new testContext()) 
      { 
       //context.Configuration.LazyLoadingEnabled = false; 
       //var teams = from t in context.teamSet.Include(p=>p.players) select t; 
       var teams = from t in context.teamSet select t; 
       foreach (var v in teams) 
       { 
        Console.WriteLine(v.players.Count()); 
       } 
       Console.Read(); 
      } 

當執行foreach語句,我認爲v.players.Count()將達到數據庫,並返回我的價值,如果我禁用延遲加載,也不會擊中數據庫並將零返回給我。但無論我啓用延遲加載還是禁用延遲加載,該值始終爲零。我對延遲加載的理解是否錯誤?任何人都可以幫忙

回答

2

試着讓你的球員的virtuel

public Virtual List<Player> players { get; set; } 
+0

虛擬是正確的關鍵字 – Tx3 2012-03-14 09:02:20

0

關於延遲加載..

在這種類型的負載,相關實體被自動加載 從數據源當您訪問導航屬性。通過此加載類型,請注意,如果實體尚不在ObjectContext中,則您將針對數據源 執行一個單獨的查詢結果的每個導航屬性。

你的情況,這將意味着,playersv(TeamSet)的導航屬性。如果加載單個team set,那麼對於該team set,實體框架也加載players

您的代碼示例可能更像是一個測試,因爲查詢沒有.Where。如果以後你會得到數百個TeamSets那麼它會導致對數據庫的大量查詢。

閱讀this瞭解爲什麼返回零計數。