2017-01-06 95 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