Объект с тем же ключом уже существует в ошибке ObjectStateManager в контроллере
У меня есть следующие ActionResults в моем контроллере (сокращены для простоты). При публикации я получаю сообщение об ошибке: объект с таким же ключом уже существует в ObjectStateManager. Я думаю, это потому, что я загружаю объект в GET ActionResult:
var t = iEquipmentTaskRepository.GetSingle(taskID);
и затем снова загружаю его в пост и пытаюсь отредактировать / сохранить. Мне нужно добавить новый объект обслуживания в базу данных и обновить значение в (существующем) объекте EquipmentTask. Как я могу получить ссылку на EquipmentTask уже в ObjectStateManager? Или мне лучше добавить сущность EquipmentTask в качестве свойства в моем MaintenanceViewModel? Я хочу обновить только одно свойство / столбец в объекте EquipmentTask
// 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);
}
1 ответ
Я понял, что происходит. Мне не нужно было создавать новый экземпляр 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;