2016-07-19 2 views
0

관련 mvc 응용 프로그램에 관련 데이터가 많습니다. 관련 데이터의 편집/업데이트를 허용하는 메소드를 작성해야합니다. ViewModel 이 작업을 수행하는 방법을 작성하려고 시도했지만 올바르게 작동하지 못해서 내 접근 방식이 옳았는지 확실하지 않아 일부 지침을 얻고 싶었습니다. 여기 관련 데이터에 대한 편집 방법을 작성하는 방법

내 코드입니다 :

컨트롤러 코드

[HttpPost] 
[ValidateAntiForgeryToken] 
    public ActionResult Edit(FullVesselViewModel model) 
    { 
     var vessel = new tbl_vessels 
     { 
      vessel_idx = model.vessel_idx, 
      vessel_name = model.vessel_name 
     }; 
     var vessel_spec = new tbl_vessel_spec 
     { 
      spec_idx = model.spec_idx, 
      bhp = model.bhp 
     } 
     using (var context = new dataEntities()) 
     { 
      context.Entry(vessel).State = EntityState.Modified; 
      context.Entry(vessel_spec).State = EntityState.Modified;        
      context.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
    } 

내 초기 것처럼 그 변수를 comitting, 내 뷰 모델을 선언 한 후 두 관련 기관을 분해 변수에 저장하는 것이 었습니다 수정 한 다음 내 변경 사항을 저장합니다. 위의 접근 방식은 동시성 오류를 반환합니다. 필드에 숨겨진 몇 개의 엔티티 인덱스를 저장하여 도움이되는지 확인했지만 운이 없었습니다.

보기

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.vessel_idx) 
    @Html.HiddenFor(model => model.spec_idx) 


    ...input fields etc ... 
} 

내 시나리오 이런 종류의에 대한 올바른 생각이나 내가 간단하게 할 수있는 뭔가를 설계를 통해 한인가?

다음과 SaveChanges를()에 트리거로 내가 오류는 다음과 같습니다에 대한 그 적절한 코드 &를 분석 한 후

Entity Framework: “Store update, insert, or delete statement affected an unexpected number of rows (0).” 
+0

모델 - 뷰 - 컨트롤러 태그 패턴에 대한 질문입니다 있습니다. ASP.NET-MVC 구현을위한 특정 태그가 있습니다. –

+0

어떤 종류의 동시성 오류가 발생 했습니까? 보통 비슷한 경우에 람다 (lambda) 나 LINQ (LINQ) 쿼리에 의해 일치 된 데이터가 먼저 발견됩니다. 데이터가 존재하면 변경 내용을 DB에 저장하기 위해'this.UpdateModel'과'context.SaveChanges()'를 실행합니다. –

+0

@TetsuyaYamamoto 위에 오류를 추가했습니다. – Yanayaya

답변

0

EF 예외의 소스, 당신은 이러한 솔루션 중 하나를 선택할 수 있습니다으로 context.SaveChanges() 발견 너의 문제.

변경 사항을 저장하기 전에 Added로 변경 EntityState :

EF의

var foundvessel = context.tbl_vessels.Where(x => x.vessel_idx == model.vessel_idx).FirstOrDefault(); 

var foundvspec = context.tbl_vessel_spec.Where(x => x.spec_idx == model.spec_idx).FirstOrDefault(); 

if (foundvessel != null && foundvspec != null) 
{ 
    var vessel = new tbl_vessels 
    { 
     vessel_idx = model.vessel_idx, 
     vessel_name = model.vessel_name 
    }; 
    var vessel_spec = new tbl_vessel_spec 
    { 
     spec_idx = model.spec_idx, 
     bhp = model.bhp 
    } 

    using (var context = new dataEntities()) 
    { 
     this.TryUpdateModel(vessel); 
     this.TryUpdateModel(vessel_spec);        
     context.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
} 
: 경우에

using (var context = new dataEntities()) 
{ 
    context.Entry(vessel).State = EntityState.Added; 
    context.Entry(vessel_spec).State = EntityState.Added;        
    context.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

또는 데이터 일치를 발견 한 후 컨트롤러 액션 내부 TryUpdateModel을 사용하여, 당신은 기본 키를 변경하지 않고 데이터를 업데이트 할 필요가 생성 된 오류는 일부 테이블의 기본 키 값을 업데이트하려고하는 낙관적 인 동시성 예외를 나타냅니다 (예 : vessel_idx).3210 spec_idx은 각 목표 테이블의 기본 키입니다. EF는 기존 데이터에 대한 업데이트가 아닌 새로운 행을 추가하는 것으로 처리합니다. 기본 키가

모든 개선 사항이나 제안은 환영 변경되지 않은 상태로 기존의 경우 새 기본 키가

  • EntityState.Modified을 추가 한 경우

  • 관련 문제