2010-11-18 6 views
3

Je rencontre un petit problème en utilisant les propriétés de navigation et l'héritage sur ADO.NET.Propriétés de navigation ADO.NET

Ceci est mon modèle de données:

ADO.NET Data Model

D'abord, un peu de vocabulaire:

Categoria = Catégorie
Formulario = Formulaire
Campo = Champ
Imagem = Image
Paragrafo = Paragraphe
Escolha = Choix
Texto = Texte
Resposta = Réponse

Donc, je suis en train de créer une propriété personnalisée sur un formulaire, il est des réponses de retour comptent.

L'approche normale (je pense) serait:

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; 
     } 
    } 
} 

Mais il ne fonctionne pas. La liste itens renvoie 0 éléments. Mais quand je fais comme ci-dessous, il retourne les 4 éléments qu'il devrait:

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; 
     } 
    } 
} 

Il ne fonctionne que lorsque j'instancier l'ensemble du modèle de données. Est-ce que quelqu'un sait pourquoi?

PS: J'utilise la méthode .toList() pour que je puisse utiliser toutes les requêtes Linq, non seulement les Linq2Entities me permet de

Répondre

2

Je devine que vous êtes soit en utilisant Entity Framework 1 ou vous ne pas avoir un chargement paresseux activé dans Entity Framework 4.

Dans votre classe, vous vous attendez à ce que la collection Itens soit chargée. Ce n'est pas toujours le cas car la collection ne sera chargée que si elle a été explicitement chargée lorsque l'objet Formulario a été extrait de la base de données.

Vous devez ajouter deux lignes de code et tout devrait être bon pour aller:

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

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

Mais je suis l'extension de la classe Formulario créée par Entity Framework. Puisque la propriété est activée lorsque l'objet est instancié, je suppose que la propriété de navigation intégrée fonctionnerait. Mais ce n'est pas le cas:/ –

+0

@Rodrigo - Je comprends maintenant ... Je vais mettre à jour. –

+0

Bingo! Fonctionne bien maintenant. Merci! –

Questions connexes