控制器中的ObjectStateManager错误中已经存在具有相同键的对象

Posted

技术标签:

【中文标题】控制器中的ObjectStateManager错误中已经存在具有相同键的对象【英文标题】:An object with the same key already exists in the ObjectStateManager error in controller 【发布时间】:2013-07-27 17:25:08 【问题描述】:

我的控制器中有以下 ActionResults(为简单起见已截断)。当我发布时,我收到错误:ObjectStateManager 中已存在具有相同键的对象。我认为这是因为我在 GET ActionResult 中加载了一个实体:

var t = iEquipmentTaskRepository.GetSingle(taskID);

然后在帖子中再次加载它并尝试编辑/保存它。我需要向数据库添加一个新的维护实体并更新(现有)设备任务实体中的值。如何在 ObjectStateManager 中获得对 EquipmentTask 的引用?或者,将 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;

【讨论】:

以上是关于控制器中的ObjectStateManager错误中已经存在具有相同键的对象的主要内容,如果未能解决你的问题,请参考以下文章

无法删除该对象,因为它在 ObjectStateManager 中找不到

c# ef 修改提示,ObjectStateManager 中已存在具有同一键的对象。

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象