2014-09-26 5 views
0

WEB 용 VisualStudio Exrpess 2013 및 을 사용하여 데이터베이스를 만든 다음 MVC 솔루션을 만들었습니다. 드롭 다운 목록이있는 편집 뷰를 표시하기 위해 ViewModel을 만들었습니다. 뷰 모델에는 데이터베이스의 주 테이블을 나타내는 모델 인 PartnerList 유형의 'parlists'속성과 뷰에서 드롭 다운 목록을 만드는 데 사용하는 SelectList 유형의 2 가지 속성 만 포함됩니다. 나는 HttpGet 편집 방법에 대한 다음 코드를 컨트롤러에서DbContext의 변경 내용이 저장되지 않았습니다. - MVC 엔터티 프레임 워크

public class FileStatusEdit 
{ 
    public SelectList HoldingsStatus { get; set; } 
    public SelectList RealGainStatus { get; set; } 
    public PartnerList parlists { get; set; } 
} 

: 다음과 같이 뷰 모델의 코드는이 코드는 잘 작동하고 뷰가 올바르게 표시됩니다

public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var viewModel = new FileStatusEdit 
     { 
      HoldingsStatus = new SelectList(db.Statuses, "Status_ID", "Status1", db.PartnerLists.Where(p => p.IntermediaryID == id).Single().AssetDataSource.HoldingsFile.Status_ID), 
      RealGainStatus = new SelectList(db.Statuses, "Status_ID", "Status1", db.PartnerLists.Where(p => p.IntermediaryID == id).Single().AssetDataSource.RealGainFile.Status_ID), 
      parlists = db.PartnerLists 
      .Include(p => p.AssetDataSource) 
      .Where(p => p.IntermediaryID == id) 
      .Single() 
     }; 
     if (viewModel.parlists == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(viewModel); 
    } 

양식을 드롭 다운 목록과 함께 사용하십시오. 꽤 길고 관련성이 없기 때문에 뷰 코드를 생략합니다. 지금까지 너무 좋아. 그러나 내 Http Post Edit 메서드는 데이터베이스에 변경 내용을 저장하지 않습니다. 다음과 같이 코드는 다음과 같습니다

[HttpPost, ActionName("Edit")] 
    [ValidateAntiForgeryToken] 
    public ActionResult EditPost(FileStatusEdit newParList) 

    { 
     if (TryUpdateModel(newParList.parlists, "", 
      new string[] { "Firstname", "Surname", "Category", "ClientID", "IntermediaryID", "ExternalRef", "RecordStatus", "Asset_Data_Source_ID", "New_Communication_Issued", "AssetDataSource", "HoldingsFile", "RealGainFile"})) 

     { 
      try 
      { 
       db.Entry(newParList.parlists).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      catch (RetryLimitExceededException) 
      { 
       ModelState.AddModelError("", "Unable to save changes."); 
      } 
     } 
     return View(newParList); 
    } 

당신은 내가 EditPost 방법에 뷰 모델 (newParList)를 통과하고 다음 나는 TryUpdateModel를 사용하여 업데이트 볼 수 있듯이. 디버깅 프로세스를 단계별로 수행하면 데이터베이스 레코드 newParList.parlists가 사용자 입력으로 올바르게 업데이트되지만 db.SaveChanges() 단계가 실행될 때 프로그램이 데이터베이스에 변경 내용을 저장하지 않고 인덱스보기로 리디렉션된다는 것을 알 수 있습니다. 일부 게시물에서 제안한대로 첨부를 사용했지만 첨부 단계가 이미 'db.Entry (newParList.parlists) .State = EntityState.Modified;'줄에 포함되어 있다고 생각합니다. 그리고 그것은 실제로 문제를 해결하지 못했습니다. 많은 게시물을 검토하고 다른 솔루션을 시도했지만 그 중 아무 것도 작동하지 않아 도움이되었습니다.

답변

0

해결책을 찾은 것 같습니다. 올바른 엔티티를 업데이트하지 않았습니다. 와

   db.Entry(newParList.parlists).State = EntityState.Modified; 

: : 이제 내 기관 HoldingsFile 및 RealGainFile이 (SaveChages 후 업데이트됩니다

   db.Entry(newParList.parlists.AssetDataSource.HoldingsFile).State = EntityState.Modified; 
       db.Entry(newParList.parlists.AssetDataSource.RealGainFile).State = EntityState.Modified; 

)가 실행되는 내 HttpPost 편집 방법에 는 지금 다음 줄을 교체했다.

0

컨텍스트 추가 또는 업데이트가 누락 된 것 같습니다. 다음은 새 레코드 만들기를 처리하는 방법의 예입니다.

업데이트하려면 먼저 레코드를 찾은 다음 변경 사항을 저장하십시오.

public void SaveCreatedMessage(Message message) 
    { 
     var dbEntry = _context.Message.Add(message); 
     if (dbEntry != null) 
     { 
      // Create the new record 
      dbEntry.CustomerID = message.CustomerID; 
      dbEntry.MessageID = message.MessageID; 
      dbEntry.Description = message.Description; 
      dbEntry.Text = message.Text; 
      dbEntry.IsRead = message.IsRead; 
      dbEntry.CreatedOn = message.CreatedOn; 
      dbEntry.CreatedBy = message.CreatedBy; 

      _context.Message.Add(message); 
     } 

     _context.SaveChanges(); 
    } 
+0

제안 해 주셔서 감사합니다. 해결책을 찾았는데 제 질문에 대한 대답으로 게시했습니다. – UbuntuDude

+0

불완전한 레코드 즉, 외래 키가없는 경우 유효성 검사 오류가 발생하는 대신 저장시 해당 레코드를 건너 뜁니다. 따라서 모든 것이 성공적으로 보이는 동안 아무 것도 저장되지 않습니다. – MikeT