2017-01-06 98 views
0

我在創建對象時遇到了問題。我的實體具有「分層」的一對多關係。一個部門可以屬於另一個部門。 這裏是我的實體:MVC4,EF:用「分層」一對多關係創建新對象

//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這樣的:

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

這裏創建對象,但沒有父師......

我真的很迷茫......如果有人有任何想法...提前謝謝。

+0

你真的是指「通知」?即A部門擁有擁有A的B?或者你的意思是「等級」? A擁有B,C,D; C擁有E,F等,但它永遠不會回到A? –

+0

@AdamBenson對不起,正如你所說,這是分層次的,不是圓形的,謝謝 – Pookye

回答

0

這與自我參照關係無關。如果ParentDivision尚未設置,則它將爲空,並且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