我真的很感激对此的一些见解:以下代码
[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);
}
为什么会发生这种情况以及如何使其发挥作用,请帮助。
答案 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。