“编辑”操作(ASP.NET,EF5)中未更新关系字段

时间:2013-04-09 07:02:03

标签: asp.net-mvc entity-framework entity-framework-5 html-select

我真的很感激对此的一些见解:以下代码

        [HttpPost]
    public ActionResult Edit(BeamCollection beamcollection)
    {
        if (ModelState.IsValid)
        {
            beamcollection.BeamMaterial = db.Types.Find(Convert.ToInt32(Request.Form.Get("BeamMaterial_ID")));
            db.Entry(beamcollection).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Details", "Bridge");
        }
        return View(beamcollection);
    }

当我尝试修改BeamCollection记录时,所有更改都会反映并保存到数据库中,但beamcollection.BeamMaterial除外,它从DropDownList中获取所选值。当我调试时,我可以看到所选的值被分配给beamcollection.BeamMaterial!

顺便说一下,这个字段定义如下

public virtual AllTypes BeamMaterial { get; set; }

因此它反映了与AllTypes的一对多关系,但它是一种单向关系。

有什么奇怪的(对我来说),是用于Create动作的相同技术,它完美有效:

    public ActionResult Create(BeamCollection beamcollection)
    {
        if (ModelState.IsValid)
        {
            beamcollection.BridgeInfo = db.Bridges.Find(bridgeID);
            beamcollection.BeamMaterial = db.Types.Find(Convert.ToInt32(Request.Form.Get("BeamMaterial_ID")));
            db.BeamCollections.Add(beamcollection);
            db.SaveChanges();
            return RedirectToAction("Details", "Bridge");
        }
        return View(beamcollection);
    }

为什么会发生这种情况以及如何使其发挥作用,请帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用:

db.attach(beamcollection.GetType().Name,beamcollection);
db.ObjectStateManager.ChangeObjectState(beamcollection, EntityState.Modified);
db.SaveChanges();

答案 1 :(得分:0)

感谢Fabrice的提示,我设法找到了正确的方法,以下是代码:

            var currentBeamCollection = db.BeamCollections.Find(beamcollection.ID);
            db.Entry(currentBeamCollection).CurrentValues.SetValues(beamcollection);
            currentBeamCollection.BeamMaterial = beamcollection.BeamMaterial;
            db.SaveChanges();

逻辑如下:获取原始记录,更新所有字段(导航属性除外,如下所示),更新导航属性,最后保存。

当我尝试执行以下操作时

db.Entry(currentBeamCollection).CurrentValues.SetValues(beamcollection.BeamMaterial);

系统失败,异常抱怨设置ID属性。我还读到CurrentValues.SetValues()不更新导航属性,我注意到BeamMaterial属性没有更新,所以我需要手动更新它。

谢谢Fabrice。