2011-07-13 7 views
0

私は更新しようとすると、私は、コントローラのポストアクションObjectStateManagerエラー

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に格納されます。指定されたオブジェクトのキー値が、変更を適用する必要があるオブジェクトのキー値と一致することを確認します。 私は解決策を探していたし、私はこれを見つけた:それはうまく動作しますが、私は、これは愚かな決断だと思うと、私はそこにあると信じて

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

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(); 
    } 
} 

1行のみを追加より良い方法と説明???

答えて

0

これは、ApplyCurrentValuesの仕組みです。エンティティを最初に読み込む必要があります(エンティティを変更するときに使用されます)。

public void Update(Proposal proposal) 
{ 
    mContext.Proposals.Attach(proposal); 
    mContext.ObjectStateManager.ChangeObjectState(proposal, EntityState.Modified); 
} 
+0

スロー:参照整合性制約違反が発生しました:参照制約を定義するプロパティの値は、プリンシパルと依存オブジェクト間で一貫していない、あなたが最初にそれをロードしたくない場合は、にごUpdate方法を変更します関係。 on mContext.Proposals.Attach(proposal); – user816153

+0

'Proposal'に' User'と 'Customer'のナビゲーションプロパティがありますか?彼らの価値は何ですか? –

+0

ModelView.Proposalの意味ですか?私はページの<%:Html.TextBoxFor(m => m.Proposal.User.Username、新しい{@class = "customer_input"、@ readonly = "readonly"})%> – user816153

関連する問題