2

これについての洞察をいただければ幸いです: 次のコード

        [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 レコードを変更しようとすると、DropDownList から選択した値を取得する beamcollection.BeamMaterial を除いて、すべての変更が反映されて DB に保存されます。デバッグすると、選択した値が beamcollection.BeamMaterial に割り当てられていることがわかります!

ちなみに、このフィールドは次のように定義されています

public virtual AllTypes BeamMaterial { get; set; }

つまり、AllTypes との 1 対多の関係を反映していますが、これは単方向の関係です。

(私にとって)奇妙なことは、作成アクションに同じ手法が使用され、完全に機能することです。

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

なぜこれが起こっているのか、どうすればうまくいくのか、助けてください。

4

2 に答える 2

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 プロパティが更新されていないことに気付いたので、手動で更新する必要がありました。

ありがとうファブリス。

于 2013-04-10T06:37:16.430 に答える