0

次のAsp.NetMVC4スキャフォールドコードがあります。

    //
    // POST: /Detail/Edit/5

    [HttpPost]
    public ActionResult Edit(Detail detail)
    {
        var dd = Details.FirstOrDefault(d => d.DetailId == detail.DetailId);
        if (dd == null)
        {
            return HttpNotFound();
        }

        detail.UpdatedBy = User.Identity.Name;
        detail.UpdateTime = DateTime.Now;
        if (ModelState.IsValid)
        {
            _db.Entry(detail).State = EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Index", new { id = detail.MasterId });
        }
        return View(dealDetail);
    }

ただし、この行で_db.Entry(detail).State = EntityState.Modified;は次のエラーが発生します。マスター/詳細編集シーナリーの詳細行を更新する正しい方法は何ですか?

同じキーを持つオブジェクトは、ObjectStateManagerにすでに存在します。ObjectStateManagerは、同じキーを持つ複数のオブジェクトを追跡できません。

4

1 に答える 1

3

この行:

var dd = Details.FirstOrDefault(d => d.DetailId == detail.DetailId);

データベースからDetailエンティティがロードされます。これで、同じIDを持つ2つの詳細がありますが、永続化に使用できるのは1つ(そのクエリによってロードされたもの)のみです。コードを次のように変更できます。

if (!Details.Any(d => d.DetailId == detail.DetailId))
{
    return HttpNotFound();
}

または、添付の詳細()を更新しますdd。例:

// All values of detail entity must be set in your HTTP post! 
_db.Entry(dd).CurrentValues.SetValues(detail);    
于 2013-03-26T08:41:13.107 に答える