.ApplyCurrentValues抛出异常,说明实体密钥不匹配

时间:2013-04-16 21:48:56

标签: c# asp.net-mvc asp.net-mvc-2 entity-framework-4 objectstatemanager

这是我得到的例外:

“在ObjectStateManager中找不到具有与提供的对象的键匹配的键的对象。验证提供的对象的键值是否与必须应用更改的对象的键值匹配。”< / p>

它由下一行播出:

public void UpdateTransaction(Transaction transaction)
{
   db.Transactions.ApplyCurrentValues(transaction);
}

我在这个页面上看到错误可能因为它没有附加,但当我尝试附加它时,我得到另一个例外:

“IEntityChangeTracker的多个实例无法引用实体对象。”

通过做一些阅读,这意味着该记录已经附加到模型上。

当我试图分开时,我得到了下一个:

“无法分离对象,因为它未附加到ObjectStateManager。”

这是我的控制器,我更新了表“InputValue”,现在取决于我还希望在“Transaction”表上进行更新的值,这是由updatedTransactions函数完成的。

    [HttpPost]
    public ActionResult Edit(int id, FormCollection collection)
    {
        var inputValue = inputValueRespository.GetInputValue(id);

        if (inputValue == null)
            return RedirectToAction("Index");

        try
        {
            UpdateModel(inputValue, collection.ToValueProvider());
            inputValue.InputValues_EditUser = WindowsIdentity.GetCurrent().Name;
            inputValue.InputValues_EditDate = DateTime.Today.Date;
            inputValueRespository.UpdateInputValue(inputValue);
            List<Transaction> updatedTransactions = inputValueRespository.HasTransactions(inputValue.Input_ID, inputValue.InputValues_Date, inputValue.InputValues_Week, inputValue.InputValues_Quarter);
            for (int i = 0; i < updatedTransactions.Count; i++)
            {

                transactionRepository.UpdateTransaction(updatedTransactions[i]);
            }
            inputValueRespository.save();
            return RedirectToAction("Create");
        }
        catch (Exception)
        {
            return View("Create");
        }

这是功能:

public List<Transaction> HasTransactions(int id, DateTime date, string week, string quarter)
    {
       // random code that decides if transaction should be update
         Transaction transaction = new Transaction();
            transaction = (from a in db.Transactions where a.KPI_ID == kpiId && a.Transaction_Period == period select a).SingleOrDefault();

//生成新结果的随机代码

                // fill the list of transaction that will be returned         
                transaction.Transaction_Value = result;
                trasactions.Add(transaction);
            }
        }
        return trasactions;
    }

在这一方面我完全无能为力,任何帮助都会非常感激。

PS:我使用ApplyCurrentValue的任何其他代码都可以正常工作。

1 个答案:

答案 0 :(得分:0)

我终于让它工作了(通过反复试验)

最后我需要分离对象,附加它,修改,应用然后保存。

db.Transactions.Detach(transaction);
db.Transactions.Attach(transaction);
transaction.Transaction_Value = result;
db.Transactions.ApplyCurrentValues(transaction);
db.SaveChanges();

没有多大意义,但我想这只是它的工作方式:)