我正在进行MVC 3 Web应用程序并且遇到了奇怪的问题。这是一些代码:
模型声明:
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());
}
我找到了简单的解决方法:
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点)这可以自动填充SOMEHOW:)
有什么办法吗?
基于给定答案的另一次尝试:
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点)。有什么建议吗?
由于
答案 0 :(得分:5)
如果您在评论和项目之间有外键,则可以执行此类操作
db.ContextOptions.LazyLoadingEnabled = false;
var projects = from p in db.Projects.Include("Comments")
orderby p.TimeAdded descending
select p;
当您执行.ToList()时,它将加载所有项目的所有注释。您将能够通过项目对象的导航属性“注释”访问数据。
答案 1 :(得分:0)
当您在断点处停止并检查查询结果时,您有效地触发“ToList”执行,因此您的新代码 执行与调试会话相同的自动填充。