0

コントローラーに次の ActionResults があります (簡単にするために切り捨てられています)。投稿すると、エラーが発生します:同じキーを持つオブジェクトが ObjectStateManager に既に存在します。これは、GET ActionResult でエンティティを読み込んでいるためだと思います。

var t = iEquipmentTaskRepository.GetSingle(taskID);

その後、投稿に再度読み込み、編集/保存しようとしています。新しい Maintenance エンティティをデータベースに追加し、(既存の) EquipmentTask エンティティの値を更新する必要があります。ObjectStateManager に既にある EquipmentTask への参照を取得するにはどうすればよいですか? または、EquipmentTask エンティティを MaintenanceViewModel のプロパティとして追加したほうがよいでしょうか? EquipmentTask エンティティの 1 つのプロパティ/列のみを更新したい

// GET
public ActionResult Create(int taskID = 0)
{
    if (taskID == 0)
    {
        return RedirectToAction("SelectEquipmentTask", "Maintenance");
    }
    else
    {
        var t = iEquipmentTaskRepository.GetSingle(taskID);

        var maintenanceViewModel = new MaintenanceViewModel
        {
            DueDate = t.MaintenanceDueDate
        };
        return View(maintenanceViewModel);
    }
}

// POST
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(MaintenanceViewModel maintenanceViewModel)
{
    if (maintenanceViewModel.DueDate != null)
        nextDueDate = maintenanceViewModel.DueDate.AddDays(7);

    Maintenance maintenance = new Maintenance();
    maintenance.RowId = maintenanceViewModel.RowId;

    // this appears to be my problem. I am loading the same EquipmentTask as the GET method does

    var t = iEquipmentTaskRepository.GetSingle(maintenanceViewModel.TaskId);
    EquipmentTask equipmentTask = new EquipmentTask();
    equipmentTask.TaskId = maintenanceViewModel.TaskId;
    equipmentTask.MaintenanceDueDate = nextDueDate;

    try
    {
        if (ModelState.IsValid)
        {
            iMaintenanceyRepository.Add(maintenance);
            iMaintenanceyRepository.Save();

            iEquipmentTaskRepository.Edit(equipmentTask);
            iEquipmentTaskRepository.Save();

            // redirect to the Details view
            return RedirectToAction("Details", "Maintenance", new { id = maintenance.RowId });
        }
    }
    catch (DataException)
    {
        //Log the error (add a variable name after DataException)
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }
    return View(maintenanceViewModel);
}
4

1 に答える 1

0

私は何が起こっているのかを理解しました。EquipmentTask の新しいインスタンスを作成する必要はありませんでした (Duh):

var t = iEquipmentTaskRepository.GetSingle(maintenanceViewModel.TaskId);

EquipmentTask equipmentTask = new EquipmentTask(); // <-- this line was not necessary

equipmentTask.TaskId = maintenanceViewModel.TaskId;
equipmentTask.MaintenanceDueDate = nextDueDate;

新しいインスタンスを追加したのではなく、既存のインスタンスを更新しただけです。行を削除すると、機能しました:

var equipmentTask = iEquipmentTaskRepository.GetSingle(maintenanceViewModel.TaskId);
equipmentTask.TaskId = maintenanceViewModel.TaskId;
equipmentTask.MaintenanceDueDate = maintenanceViewModel.NextDueDate;
于 2013-07-27T21:07:35.417 に答える