Ошибка ObjectStateManager - PullRequest
       4

Ошибка ObjectStateManager

0 голосов
/ 13 июля 2011

У меня есть пост контроллера действия

public ActionResult Demographics(string submitButton, DemographicsViewModel model)
{
    switch (submitButton)
    {
        case "Home":
            return RedirectToAction("Index");
        case "Next Page":
            using (ProposalRepository proposalRepository = new ProposalRepository())
            {
                model.Proposal.UserID = proposalRepository.GetUserByName(MasterHelper.CurrentUsername).UserID;
                model.Proposal.CustomerID = proposalRepository.GetCustomerByName(model.CustomerName).CustomerID;

                if (model.Proposal.ProposalID != 0)
                {
                    proposalRepository.Update(model.Proposal);
                }
                else
                {
                    proposalRepository.AddProposal(model.Proposal);
                }

                proposalRepository.SaveChanges();
            }

            return RedirectToAction("GRQuestions", model.Proposal);
        default:
            return View();
    }
}

Когда я пытаюсь обновить

public void Update(Proposal proposal)
{
    mContext.Proposals.ApplyCurrentValues(proposal);
}

ошибка выброса: Не удалось найти объект с ключом, совпадающим с ключом предоставленного объекта, в ObjectStateManager. Убедитесь, что значения ключей предоставленного объекта соответствуют значениям ключей объекта, к которому должны применяться изменения. Я искал решение и нашел это:

public ActionResult Demographics(string submitButton, DemographicsViewModel model)
{
    switch (submitButton)
    {
        case "Home":
            return RedirectToAction("Index");
        case "Next Page":
            using (ProposalRepository proposalRepository = new ProposalRepository())
            {
                Proposal proposal = proposalRepository.GetById(model.Proposal.ProposalID);

                model.Proposal.UserID = proposalRepository.GetUserByName(MasterHelper.CurrentUsername).UserID;
                model.Proposal.CustomerID = proposalRepository.GetCustomerByName(model.CustomerName).CustomerID;

                if (model.Proposal.ProposalID != 0)
                {
                    proposalRepository.Update(model.Proposal);
                }
                else
                {
                    proposalRepository.AddProposal(model.Proposal);
                }

                proposalRepository.SaveChanges();
            }

            return RedirectToAction("GRQuestions", model.Proposal);
        default:
            return View();
    }
}

добавить только одну строку:

Proposal proposal = proposalRepository.GetById(model.Proposal.ProposalID);

Это работает хорошо, но я думаю, что это глупое решение, и я считаю, что есть лучший способ и объяснение ???

1 Ответ

0 голосов
/ 13 июля 2011

Так работает ApplyCurrentValues.Вы должны сначала загрузить объект, чтобы использовать его (= он используется при изменении присоединенного объекта).Если вы не хотите сначала загружать его, измените метод Update на:

public void Update(Proposal proposal)
{
    mContext.Proposals.Attach(proposal);
    mContext.ObjectStateManager.ChangeObjectState(proposal, EntityState.Modified);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...