我正在做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());
}
- 当我运行项目注释不是我的视图中可见。
- 我在linq查询,调试和检查“项目”变量字段之后立即设置断点注释,它们没有填充。然后我检查“注释”变量,它有一些数据。再次检查“项目”变量和SOMEHOW字段填充评论,最后在网站上显示评论。如果我不设置断点并检查变量“注释”是否填充,它们将不会出现在网站上。 (我希望这是可以理解的)
我找到简单的解决方法:
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)。有什么建议么?
感谢
3.你的代码是纯粹的邪恶。我希望你知道这一点。 – flq 2011-03-06 18:41:17
为什么它是纯粹的邪恶? – 2011-03-06 19:33:43
你应该真的考虑一个问题的分离,你的控制器中有太多的事情要做。使用返回数据并将其移出控制器的方法创建存储库。尝试查看一些关于MVC最佳实践的文档,让您朝着正确的方向前进。 – 2011-03-07 06:30:36