2017-06-01 37 views
0

我对.NET MVC 5相当陌生,主要来自PHP背景。我有一个带有List集合的'Project'模型。当我仅使用测试控制器将数据保存到集合中时,它将会保存到数据库中。MVC NET 5链接模型保存到数据库但不加载

问题出现在我试图从该集合中取出信息时,因为它总是返回为空。

我的项目模型:

public class Project 
{ 
    public int ID { get; set; } 

    [Display(Name = "Project")] 
    public string ProjectNumber { get; set; } 

    [Display(Name = "Client")] 
    public string Client { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    [Display(Name = "Start Date")] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    public DateTime StartDate { get; set; } 

    [Display(Name = "Required Date")] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    public DateTime RequiredDate { get; set; } 

    public string ProjectManagerId { get; set; } 

    [ForeignKey("ProjectManagerId")] 
    [Display(Name = "Project Manager")] 
    public ApplicationUser ProjectManager { get; set; } 

    [Display(Name = "Project Members")] 
    public int[] ProjectMembers { get; set; } 

    [Display(Name = "Tasks")] 
    public List<ProjectTask> TaskCollection { get; set; } 

} 

public class ProjectDb : DbContext 
{ 
    public ProjectDb() : base("DefaultConnection") 
    { 

    } 

    public DbSet<Project> Projects { get; set; } 
} 

我ProjectTask型号: 公共类ProjectTask {

public int Id { get; set; } 

    public int ProjectId { get; set; } 

    [ForeignKey("ProjectId")] 
    public virtual Project Project { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public string TaskNotes { get; set; } 

    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    public DateTime StartDate { get; set; } 

    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    public DateTime DueDate { get; set; } 

    public int Duration { get; set; } 

    public TaskStatus Status { get; set; } 

    public TaskAlertLevel AlertLevel { get; set; } 

    public List<ProjectTask> SubTasks { get; set; } 

    public string Progress { get; set; } 
} 


public class ProjectTaskDb : DbContext 
{ 
    public ProjectTaskDb() : base("DefaultConnection") 
    { 

    } 

    public DbSet<Project> ProjectTasks { get; set; } 
} 

我的控制器,我只是想多看少空例外以外的东西:

public ActionResult DetailTasks(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     Project project = db.Projects.Find(id); 

     if (project == null) 
     { 
      return HttpNotFound(); 
     } 

     var tasks = project.TaskCollection; 

     ViewBag.tasks = tasks; 
     return View(project); 

    } 

希望它是索姆完全明显和愚蠢的东西,现在逃脱了我!

+0

你确定你确实将它保存到数据库吗?如果你调用db.Projects.Add(不管);而不是调用db.SaveChanges();在那之后,它实际上从来没有真正被保存到数据库中,它只是一个软添加,但不会提交更改。 –

+0

是的,它绝对保存,因为我调用db.Projects.Add(项目)以及db.SaveChanges()。测试数据也显示在原始数据库表中,他们只是从未出来访问过。 –

+0

可能最好检查您的ID列是否实际标记为主键,如果不是,则将[Key] Data属性放在其上方并添加新的迁移/更新数据库。 如果它仍然是拙作,那么你总是可以将行翻转到 Project project = db.Projects.where(a => a.ID == id).FirstOrDefault(); –

回答

0

道歉的问候的意见,由于某种原因,我还以为你有问题加载最初的项目对象。所以看你的项目实体已延迟加载关闭,因为你不使用虚拟关键字:

public List<ProjectTask> TaskCollection { get; set; } 

VS

public virtual List<ProjectTask> TaskCollection { get; set; } 

当你这样做,你必须明确地或急切加载TaskCollection

Exlicitly负载:

​​

热切负载:

Project project = db.Projects.where(a => a.ID == id).Include(b => b.TaskCollection).FirstOrDefault(); 

p.s.你可能不得不和我的背景一起玩,因为我不在我可以加载的地方VS

+0

我添加虚拟到TaskCollection,它开始加载数据,我想我只是不知道何时使用虚拟或不在这种类型的框架。现在回到找出一些奇怪的循环引用错误,谢谢! –

+0

很高兴听到,这里是一个相当不错的细分时间和为什么如果你的大脑需要打破循环引用:https://visualstudiomagazine.com/articles/2016/11/01/lazy-loading-in- entity-framework.aspx –

+0

非常感谢,谢谢! –

0

嗨,你可以改变这一行试试:var tasks = project.TaskCollection;喜欢这样的:var tasks = project.TaskCollection.ToList();,它可以帮助你

完整的示例/更改代码:

public ActionResult DetailTasks(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     Project project = db.Projects.Find(id); 

     if (project == null) 
     { 
      return HttpNotFound(); 
     } 

     var tasks = project.TaskCollection.ToList(); 

     ViewBag.tasks = tasks; 
     return View(project); 

    } 

我相信这个时候你不会得到空的该项目.TaskCollection,如果数据库中的数据可用。

希望将上述信息是有用的,请让我知道你的想法或反馈

感谢

KARTHIK

+0

我试过了,它仍然给我一个空结果。 ProjectTask的表中有数据,我已经将其拉出并检查了多次,并且数据应该正确链接到项目,就好像我尝试删除数据库中的项目行一样,它会引发参照完整性错误。 –

相关问题