2010-11-18 205 views
3

我在使用ADO.NET上的導航屬性和繼承時遇到了一些問題。ADO.NET導航屬性

這是我的數據模型:

ADO.NET Data Model

首先,一些詞彙:

Categoria =類別
Formulario =表單
坎普=字段
IMAGEM =圖片
Paragrafo =段落
Escolha =選擇
Texto =文本
Resposta =回答

所以,我試圖創建一個表單返回它的答案指望一個自定義屬性。

正常的做法(我覺得)是:

public partial class Formulario 
{ 
    public int Respostas 
    { 
     get 
     { 
      List<Item> itens = this.Itens.ToList(); 

      IEnumerable<Campo> campos = from m in itens where m as Campo != null select (Campo)m; 
      int soma = campos.Sum(m => m.Respostas.Count); 

      return soma; 
     } 
    } 
} 

但它不工作。 itens列表返回0個元素。但是,當我做如下,它返回4項應:

public partial class Formulario 
{ 
    public int Respostas 
    { 
     get 
     { 
      FormulariosDB db = new FormulariosDB(); 

      List<Item> itens = db.Items.Where(m => m.Formulario.Id == this.Id).ToList(); 

      IEnumerable<Campo> campos = from m in itens where m as Campo != null select (Campo)m; 
      int soma = campos.Sum(m => m.Respostas.Count); 

      return soma; 
     } 
    } 
} 

當我實例化整個數據模型,它纔會起作用。有誰知道爲什麼?

PS:我使用的是.toList()方法,所以我可以使用所有Linq查詢,而非僅僅Linq2Entities讓我

回答

2

我使用實體框架1猜你要麼也可以沒有在實體框架4中啓用延遲加載。

在您的課堂上,您期望加載Itens集合。這並不總是這種情況,因爲只有在從數據庫中檢索Formulario對象時顯式加載該集合纔會加載該集合。

您需要添加的代碼,一切兩行應該是好去:

if(!Itens.IsLoaded) 
    Itens.Load(); 

List<Item> itens = Itens.ToList(); 
+0

但我延長實體框架創建的Formulario類。由於該屬性在對象被實例化時已被隱藏,因此我假設內置的Navigation屬性將起作用。但它不:/ – 2010-11-18 14:23:12

+0

@羅德里戈 - 我現在明白了......我會更新。 – 2010-11-18 14:24:19

+0

賓果!現在工作正常。謝謝! – 2010-11-18 14:30:54