1

私はこれに比較的慣れていませんが、これは本当に単純なはずなので、まだ少し恥ずかしいです...

私がやろうとしているのは、データベーステーブルの既存の行を更新することだけです。私は最初にEF(私が信じる5)コードを使用しています。

MVC 3の場合、私はこのアプローチを使用しました(これは機能しました):

ReportCommon reportcommon = db.ReportCommon.Single(r => r.ReportCommonId == id);
reportcommon.IP = StaticUtilities.GetIPAddress();
db.ObjectStateManager.ChangeObjectState(reportcommon, EntityState.Modified);
db.SaveChanges();

私が見つけたいくつかの例を試しましたが、エラーは発生しませんが、データベースは更新されません...

[HttpPost]
public ActionResult Edit(CitizenEntryViewModel citizenDetails)
    {
        ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID);

        if (activeCitizen != null)
        {
            citizenDetails.ActiveCitizen.CitizenUpdatedRecordOn = DateTime.Now;
            // Fields we don't edit but still need to pass back
            citizenDetails.ActiveCitizen.PublicID = activeCitizen.PublicID;
            citizenDetails.ActiveCitizen.IsKIN = activeCitizen.IsKIN;
            activeCitizen = citizenDetails.ActiveCitizen;
            db.SaveChanges();
        }
4

2 に答える 2

4

新しい値のみを保存する方法を示すこのSO投稿に記載されている次のコードを使用して、この問題を解決することができました。

db.Entry(activeCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen);

「同じキーを持つオブジェクトがすでにObjectStateManagerに存在します。ObjectStateManagerは同じキーを持つ複数のオブジェクトを追跡できません」というエラーが発生したことに注意してください。

このSO投稿は、私がその問題を克服するのに役立ちました。

したがって、最終的なコードは次のとおりです。

var currentCitizen = db.ActiveCitizen.Find(citizenDetails.ActiveCitizen.ID);
db.Entry(currentCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen);
db.SaveChanges();
于 2012-12-18T12:41:50.843 に答える
0

これを試して

[HttpPost]
public ActionResult Edit(CitizenEntryViewModel citizenDetails)
{
    ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID);

    if (activeCitizen != null)
    {
        UpdateModel(activeCitizen);
        db.SaveChanges();
    }
于 2012-12-18T12:47:20.533 に答える