2011-03-06 248 views
3

我正在做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字段填充评论,最后在网站上显示评论。如果我不设置断点并检查变量“注释”是否填充,它们将不会出现在网站上。 (我希望这是可以理解的)
  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点),这是可以自动填充某种方式:)

有任何方式来做到这一点?


基础上给出答案的另一个尝试:

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

感谢

+1

3.你的代码是纯粹的邪恶。我希望你知道这一点。 – flq 2011-03-06 18:41:17

+1

为什么它是纯粹的邪恶? – 2011-03-06 19:33:43

+1

你应该真的考虑一个问题的分离,你的控制器中有太多的事情要做。使用返回数据并将其移出控制器的方法创建存储库。尝试查看一些关于MVC最佳实践的文档,让您朝着正确的方向前进。 – 2011-03-07 06:30:36

回答

0

当你在一个断点停止并检查查询结果,你是用途不同触发“ToList”的执行,让您的新代码执行相同的自动人口调试会话。

+0

我已经添加了comments.ToList(),它正在工作。但我不确定这是否是正确的解决方案。 – 2011-03-06 19:33:00

5

如果您有任何意见和项目之间的外键,你可以做这样的事情

db.ContextOptions.LazyLoadingEnabled = false; 
var projects = from p in db.Projects.Include("Comments") 
         orderby p.TimeAdded descending 
         select p; 

它会加载所有评论所有项目时,您将执行.ToList()。您将能够通过项目对象的导航属性“注释”访问数据。

+0

我可能做错了什么,但它不工作。我确定有外键。我加了db.Confiburation.LazyLoadingEnabled = false。我对项目执行ToList()并且没有数据。 – 2011-03-06 19:14:15

+1

您是否在linq中设置了Include(“Comments”)?你有把外键导入EDMX文件吗?你有没有定义从项目导航属性注释(从数据库导入EDMX属性)? – Nico 2011-03-06 20:51:44