我在做 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; }
}
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());
}
- 当我运行项目时,评论在我的 View 中不可见。
- 我在两个 linq 查询、调试和检查“项目”变量字段评论之后设置了一个断点,它们没有被填充。然后我检查“评论”变量,它有一些数据。再次检查“project”变量和 SOMEHOW 字段 Comments 被填充,最后 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 点)更好。有什么建议吗?
谢谢
最佳答案
如果您在 Comments 和 Projects 之间有一个外键,您可以这样做
db.ContextOptions.LazyLoadingEnabled = false;
var projects = from p in db.Projects.Include("Comments")
orderby p.TimeAdded descending
select p;
当您执行 .ToList() 时,它将加载所有项目的所有评论。您将能够通过项目对象的导航属性“评论”访问数据。
关于c# - Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212232/