2013-03-08 5 views
1

ASP.NET 웹 API에서 OData를 사용하는 경우 official guidance에서 데이터베이스를 수정하는 샘플에는 모두 경쟁 조건이 포함되어있는 것으로 보입니다. 예를 들어, UpdateEntity 샘플 메서드는 _context.Products.Any 다음에 _context.SaveChanges을 호출하지만 데이터베이스는 호출간에 변경되었을 수 있습니다.ASP.NET 웹 API의 OData CRUD 작업 (경쟁 조건 없음)

DbUpdateConcurrencyException의 캐치 블록을 포함하는 Entity Framework 컨트롤러가있는 새로운 웹 API에 대해 Visual Studio에서 생성 된 상용구 코드와 다릅니다. OData 업데이트 메서드의 모범 사례와 비슷한 패턴이 있습니까?

또한 Any 다음에 SaveChanges을 호출하면 두 번의 데이터베이스 왕복이 필요합니다. 단 하나만 만드는 것이 가장 좋은 방법입니까?

+1

호출 SaveChanges 다음에 오는 경쟁 조건이 제거되지 않으면 데이터 덮어 쓰기 위험이 줄어 듭니다. 당신이 필요로하는 것은 동시성 토큰을 사용하는 것이라고 생각합니다. 엔티티를 저장하려고 시도하지만 데이터베이스의 데이터가 이미 변경되면 EF가 발생합니다. 자세한 내용은 http://msdn.microsoft.com/ko-kr/library/vstudio/bb738618(v=vs.100).aspx에서 msdn 문서를 참조하십시오. DbContext를 사용하는 경우 비슷한 방법으로 작동합니다. – Pawel

답변

1

모든 호출은 업데이트하려는 엔티티가 실제로 있는지 확인하는 것입니다. 당신은 항목이 존재하지 않는 경우, SaveChanges()DbUpdateConcurrencyException를 슬로우

protected override Product UpdateEntity(int key, Product update) 
{ 
    try 
    { 
     _context.Entry(update).State = System.Data.EntityState.Modified; 
     _context.SaveChanges(); 
     return update; 
    } 
    catch(DbUpdateConcurrencyException) 
    { 
     throw new HttpResponseException(HttpStatusCode.NotFound); 
    } 
} 

, 그 행동을 변경할 수 있습니다.