2017-06-01 12 views
0

主にPHPの背景から来た.NET MVC 5の新機能です。私はそれにリストコレクションと 'プロジェクト'モデルがあります。テストコントローラを使ってコレクションにデータを保存すると、データベースに保存されます。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); 

    } 

うまくいけばそれはsom今すぐ私を逃れる完全に明白で愚かな何か!

+0

実際にDBに保存してもよろしいですか? db.Projects.Add(何でも)を呼び出している場合。 db.SaveChanges()を呼び出さない。その後、実際にデータベースに保存されることはありません。ソフト・アドを行いますが、変更をコミットしません。 –

+0

私はdb.Projects.Add(プロジェクト)とdb.SaveChanges()を呼び出しているので、間違いなく保存しています。テストデータは生のデータベーステーブルにも現れます。訪問することは決してありません。 –

+0

あなたのID列が主キーとして実際にマークされているかどうかをチェックし、それ以外の場合は[Key]データ属性を上に置き、新しいマイグレーション/アップデートデータベースを追加することをお勧めします。 それでもまだ動作している場合は、 にプロジェクトのプロジェクト= db.Projects.where(a => a.ID == id).FirstOrDefault();と入力してください。 –

答えて

0

謝罪を、知っている、有用でした最初のプロジェクトオブジェクトをロードします。あなたが仮想キーワードを使用していないので、だからあなたのプロジェクトの実体を見て、あなたは、遅延ロードがオフになっています

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

public 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();、それはあなたに

全例/変更されたコードに役立つことがあります。私は、この時間はあなたが文句を言わない場合はnullを取得信じる

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

    } 

をproject.TaskCollection(データベースで使用可能なデータの場合)。

情報の上ホープは親切に私は自分の考えやフィードバック

おかげ

カルティク私はあなたが問題を抱えて思っていたいくつかの理由のコメントに関しては

+0

私はそれを試みましたが、それはまだ私にヌルの結果を与えています。 ProjectTaskのテーブルにデータが入っています。私はそれをプルアップして複数回チェックしましたが、データをプロジェクトに正しくリンクする必要があります。データベースのプロジェクトラインを削除しようとすると参照整合性エラーが発生します。 –

関連する問題