Я занимаюсь веб-приложением MVC 3, и у меня странная проблема.Вот некоторый код:
Объявление модели:
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; }
}
Контроллер:
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());
}
- Когда я запускаю проект, комментарии не видны на моем виде.
- Я устанавливаю точку останова сразу после обоих запросов linq, отладки и проверки полей переменных проекта. Комментарии, они не заполняются.Затем я проверяю переменную "comments", в ней есть некоторые данные.Повторная проверка переменных проекта и полей SOMEHOW. Комментарии заполняются, и, наконец, комментарии появляются на веб-сайте.Если я не установлю точку останова и не проверю, заполнена ли переменная "comments", они не появятся на сайте.(Надеюсь, это понятно)
Я нашел простой обходной путь:
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());
}
, но похоже (в соответствии с пунктом 2), что это может быть автоматически заполнено.*
Есть ли способ сделать это?
Еще одна попытка, основанная на данных ответах:
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());
}
У меня есть внешний ключ.Я добавил LazyLoadingEnabled.Существует project.ToList (), и он не работает.
Основываясь на втором ответе, я сделал нечто подобное:
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());
}
Я добавил только comments.ToList () иэто работает.Но я не уверен, что это правильное решение.Вероятно, лучше, чем мой обходной путь (пункт 3).Есть предложения?
Спасибо