0

オブジェクトの作成に問題があります。私のエンティティは、「階層的な」一対一の関係を持っています。部門は別の部門に属することができます。ここ は私の実体である:MVC4、EF: "階層的な" 1対多の関係を持つ新しいオブジェクトを作成

//Properties 
    [Key] 
    [Column(Order = 0)] 
    public int DivisionId { get; set; } 

    [Required] 
    [MaxLength(30)] 
    [Column("DivisionName", Order = 2)] 
    public string Name { get; set; } 

    //Navigation properties 
    public virtual Division ParentDivision { get; set; } 
ここ

は新しい部門を作成するための私の方法であり、この場合は

public ActionResult Create() 
    { 
     ViewBag.ParentDivision = new SelectList(db.Divisions, "DivisionId", "Name"); 
     return View(); 
    } 


    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Division division) 
    {    
     if (ModelState.IsValid) 
     { 
      db.Divisions.Add(division); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.ParentDivision = new SelectList(db.Divisions, "DivisionId", "Name", division.ParentDivision.DivisionId); 
     return View(division); 
    } 

、私は別の部門に所属する部門を作成しようとすると、私を得ます"オブジェクト参照がオブジェクト インスタンスに設定されていません。"エラー。オブジェクトが作成され、ここで

ViewBag.ParentDivision = new SelectList(db.Divisions, "ParentDivision.DivisionId", "Name", division.ParentDivision.DivisionId); 

を、しかし親分裂せずに...

は、私は本当に困惑している...:

私はまた、このようViewBagを変更しようとしました誰かが何らかのアイデアを持っていたら...事前にありがとう。

+0

本当に "循環型"を意味しますか?すなわち、部門AはAを所有するBを所有しているか?あるいは「階層的」を意味しますか? AはB、C、Dを所有する。 CはE、Fなどを所有していますが、Aには戻っていませんか? –

+0

@AdamBensonはい、申し訳ありませんが、あなたが言うように、階層的で循環的ではありません。 – Pookye

答えて

0

これは自己参照関係であるという事実とは関係ありません。 ParentDivisionがまだ設定されていない場合はnullになり、nullにはDivisionIdというプロパティがないため、例外です。

プロパティを参照する前にヌルチェックを行う必要があります。おそらく、このときの最も簡単な方法は、三元を使用して次のようになります。

division.ParentDivision != null ? division.ParentDivision.DivisionId : null 

しかし、あなたはとにかく、選択された値を設定する必要はありません。 Razerはこれを自動的に処理します。また、実際にSelectListを作成する必要はありません。 Html.DropDownListForのニーズはすべてIEnumerable<SelectListItem>です。それを渡すと、ヘルパーはSelectListを作成し、該当する場合は適切な選択値を設定します。

その後
ViewBag.ParentDivision = db.Divisions.Select(m => new SelectListItem { Value = m.DivisionId, Text = m.Name }); 

:別の問題が表示されます

@Html.DropDownListFor(m => m.ParentDivisionId, (IEnumerable<SelectListItem>)ViewBag.ParentDivision) 

。現在、実際にバインドするプロパティはありません。選択リストは完全なParentDivisionインスタンスではなく、IDのみを返信するため、ParentDivisionは直接使用できません。投稿されたIDをバインドするプロパティが必要です。これはあなたのエンティティにとにかくエンティティを含めることをお勧めします。

[ForeignKey("ParentDivision")] 
public int ParentDivisionId { get; set; } 
public virtual Division ParentDivision { get; set; } 
+0

ありがとうございます!実際に私はすべてのエンティティを削除し、あなたの最後のポイントを考慮してそれを再発行しました。私も子供のコレクションを追加し、私はデータベースを更新すると、私は生成されたテーブルの違いを見た。 – Pookye

関連する問題