2011-03-06 5 views
3

Je fais l'application Web MVC 3 et j'ai un problème étrange. Voici un code:Entity Framework

Modèle de déclaration:

public class Project 
{ 
    public int ID { get; set; } 

    [Required(ErrorMessage = "Write a title.")] 
    public string Title { get; set; } 

    public DateTime TimeAdded { get; set; } 

    [Required(ErrorMessage = "Write some description.")] 
    [MaxLength(int.MaxValue)] 
    public string Content { get; set; } 

    public ICollection<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public int ID { get; set; } 

    [Required()] 
    public int ProjectID { get; set; } 

    public DateTime TimeAdded { get; set; } 

    [Required()] 
    public string Text { get; set; } 

    public Project project { get; set; } 
} 

Controller:

public class HomeController : Controller 
{ 
    dataDBContext db = new dataDBContext(); 

    // 
    // GET: /Home 

    public ActionResult Index() 
    { 
     var comments = from c in db.Comments 
         select c; 

     var projects = from p in db.Projects 
         orderby p.TimeAdded descending 
         select p; 

     return View(projects.ToList()); 
    } 
  1. Quand je lance projet Les commentaires ne sont pas visibles sur mon point de vue.
  2. Je mets un point d'arrêt juste après les deux requêtes linq, le débogage et la vérification des champs variables "projet". Les commentaires, ils ne sont pas remplis. Ensuite, je vérifie la variable "comments", elle contient des données. Encore une fois en vérifiant la variable "projet" et les champs SOMEHOW. Les commentaires sont remplis et enfin les commentaires apparaissent sur le site web. Si je ne veux pas définir le point d'arrêt et vérifier si la variable "commentaires" est remplie, ils n'apparaîtront pas sur le site Web. (J'espère que cela est compréhensible)
  3. J'ai trouvé solution simple:

    public ActionResult Index() 
    { 
        var projects = from p in db.Projects 
            orderby p.TimeAdded descending 
            select p; 
    
        foreach (var p in projects) 
        { 
         var comments = from c in db.Comments 
             where c.ProjectID == p.ID 
             select c; 
    
    
         p.Comments = comments.ToList(); 
        } 
    
        return View(projects.ToList()); 
    } 
    

    mais il semble (selon le point 2) que cela peut être automatiquement renseignée :) D'une certaine façon

est-il un moyen de le faire?


Une autre tente en fonction des réponses données:

public class HomeController : Controller 
{ 
    dataDBContext db; 

    public HomeController() 
    { 
     db = new dataDBContext(); 
     db.Configuration.LazyLoadingEnabled = false; 
    } 

    // 
    // GET: /Home 

    public ActionResult Index() 
    { 
     var projects = from p in db.Projects 
         orderby p.TimeAdded descending 
         select p; 

     return View(projects.ToList()); 
    } 

J'ai la clé étrangère. J'ai ajouté LazyLoadingEnabled. Il y a project.ToList() et cela ne fonctionne pas.

Sur la base de la deuxième réponse que je l'ai fait quelque chose comme ça:

public class HomeController : Controller 
{ 
    dataDBContext db; 

    public HomeController() 
    { 
     db = new dataDBContext(); 
    } 

    // 
    // GET: /Home 

    public ActionResult Index() 
    { 
     var projects = from p in db.Projects 
         orderby p.TimeAdded descending 
         select p; 

     var comments = from c in db.Comments 
         select c; 

     List<Comment> l = comments.ToList(); 

     return View(projects.ToList()); 
    } 

J'ai ajouté juste comments.ToList() et il fonctionne. Mais je ne suis pas sûr que ce soit une bonne solution. Probablement mieux que ma solution de contournement (point 3). Aucune suggestion?

Merci

+1

Votre code en 3. est un mal pur. J'espère que vous êtes au courant de cela. – flq

+1

Pourquoi est-ce le mal pur? –

+1

Vous devriez vraiment envisager une séparation des préoccupations, vous avez trop de choses dans votre contrôleur. Créez un référentiel avec des méthodes qui renvoient vos données et les déplacent hors du contrôleur. Essayez de vérifier quelques documents sur les meilleures pratiques MVC pour vous diriger dans la bonne direction. –

Répondre

0

Lorsque vous êtes arrêté à un point d'arrêt et d'examiner les résultats de la requête, vous déclenchez effectivly l'exécution « de ToList », de sorte que votre nouveau code est effectuer la même population automatique que votre session de débogage.

+0

J'ai ajouté juste comments.ToList() et ça marche. Mais je ne suis pas sûr que ce soit une bonne solution. –

5

Si vous avez une clé étrangère entre les commentaires et les projets que vous pouvez faire quelque chose comme ça

db.ContextOptions.LazyLoadingEnabled = false; 
var projects = from p in db.Projects.Include("Comments") 
         orderby p.TimeAdded descending 
         select p; 

Il chargera tous les commentaires pour tous les projets lorsque vous exécutez la .ToList(). Vous serez en mesure d'accéder aux données par la propriété de navigation "Commentaires" de l'objet du projet.

+0

Je fais probablement quelque chose de mal, mais ça ne marche pas. Je suis sûr que vous avez une clé étrangère. J'ai ajouté db.Confiburation.LazyLoadingEnabled = false. J'effectue ToList() sur les projets et il n'y a pas de données. –

+1

Avez-vous mis le Include ("Commentaires") dans le linq? Avez-vous importer la clé étrangère dans le fichier EDMX? Avez-vous défini une propriété de navigation des projets aux commentaires (propriété EDMX lors de l'importation depuis la base de données)? – Nico