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());
}
- Quand je lance projet Les commentaires ne sont pas visibles sur mon point de vue.
- 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)
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
Votre code en 3. est un mal pur. J'espère que vous êtes au courant de cela. – flq
Pourquoi est-ce le mal pur? –
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. –