更新复合外键

时间:2011-09-14 15:24:47

标签: asp.net-mvc-3 ef-code-first

我使用代码优先方法在ASP.NET MVC 3中使用复合主键进行自引用模型:

public class Area
{
    [Key, Column(Order=0)]
    public int Id1 { get; set; }

    [Key, Column(Order=1)]
    public int Id2 { get; set; }

    public string Name { get; set; }

    public virtual Area Parent { get; set; }
}

我希望控制器具有可以处理所有属性的创建和编辑操作,包括复合Parent(必须先添加到数据库中)。

我设法让create方法运行,但是编辑复杂字段不想更新。以下方法的输入数据成功解析为同时设置了areaarea.Parent.Id1的对象area.Parent.Id2

当前代码未保存对Parent的修改的更改:

    [HttpPost]
    public ActionResult Edit(Area area)
    {
        try
        {
            if (ModelState.IsValid)
            {
                if (area.Parent != null)
                {
                    area.Parent = db.Areas.Find(area.Parent.Id1, area.Parent.Id2);
                    if (area.Parent == null)
                        throw new NotFoundException();
                    // need to mark it as modified...
                }
                db.Entry(area).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch (NotFoundException)
        {
            //...
        }
        return View(area);
    }

1 个答案:

答案 0 :(得分:0)

如果有人需要,我找到了一种解决方法。将其添加到模型中:

    [ForeignKey("Parent"), Column(Order = 0)]
    public int Parent_Id1 { get; set; }
    [ForeignKey("Parent"), Column(Order = 1)]
    public int Parent_Id2 { get; set; }

并将其添加到“需要将其标记为已修改”的位置:

                    area.Parent_Id1 = area.Parent.Id1;
                    area.Parent_Id2 = area.Parent.Id2;