MVC4,EF:创建具有“分层”一对多关系的新对象

时间:2017-01-06 11:22:09

标签: c# entity-framework asp.net-mvc-4 persistence one-to-many

我遇到创建对象的问题。我的实体有一个“等级”的一对多关系。分工可以属于另一个分部。 这是我的实体:

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

这里创建了对象,但没有父分区...

我真的很困惑......如果有人有任何想法......提前谢谢你。

1 个答案:

答案 0 :(得分:0)

这与自我引用关系无关。如果尚未设置jQuery('button').on('added_to_cart',function() { jQuery.post("?wc-ajax=add_to_cart", { product_id: jQuery(this).attr('data-product_id'), quantity: jQuery(this).attr('data-quantity'), }, function(data,status){ }); }); ,则它将为null,并且null不具有ParentDivision属性,因此是您的例外。

在引用属性之前,您需要进行空检查。在这种情况下,最简单的方法可能是使用三元组:

DivisionId

但是,无论如何,您都不需要设置所选值。 Razer会自动处理这个问题。您也不需要创建实际的division.ParentDivision != null ? division.ParentDivision.DivisionId : null 。所有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) ,因为选择列表只会回发ID,而不是完整的ParentDivision实例。您需要一个属性来绑定发布的ID,这是一个很好的做法,无论如何都要包含在您的实体中:

ParentDivision
相关问题