实体框架

时间:2011-03-06 17:49:17

标签: c# asp.net asp.net-mvc entity-framework

我正在进行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());
    }
  1. 当我运行项目时,我的视图中看不到评论。
  2. 我在linq查询,调试和检查“项目”变量字段注释后立即设置断点,它们不会填充。然后我正在检查“评论”变量,它有一些数据。再次检查“项目”变量和SOMEHOW字段填充注释,最后评论显示在网站上。如果我不设置断点并检查是否填充了变量“comments”,它们将不会出现在网站上。 (我希望这是可以理解的)
  3. 我找到了简单的解决方法:

    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:)

  4. 有什么办法吗?


    基于给定答案的另一次尝试:

    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点)。有什么建议吗?

    由于

2 个答案:

答案 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”执行,因此您的新代码 执行与调试会话相同的自动填充。