19

Entity Framework (CF, C#)에서 SaveChanges/SaveChangesAsync을 호출 할 때 변경 충돌이 발생하면 (예 : 마지막 읽기 이후 값이 업데이트 된 경우) DbUpdateConcurrencyException OR OptimisticConcurrencyException 내가 잡을 까?Entity Framework의 동시성 예외

그리고 그 차이점은 무엇입니까?

+0

대답에 비추어 볼 때, 문서에서 예외를 찾아보고 그 설명을 읽으면서 몇 초만 생각해 보셨습니까? 기본적으로 설명서를 인용하십시오. – TomTom

+7

물론, 나는 설명서를 읽었지만 두 가지 모두 상당히 비슷해 보였으므로별로 이해가되지 않습니다. 'optimistic 동시성 예외가 발생할 수있을 때 사용하십시오'. 그래서 나는 내 질문에 상황을 제시하고 그 맥락에서 물었다! – Flair

+0

DbUpdateException, DbUpdateConcurrencyException, OptimisticConcurrencyException에 대한 Flair 문서에 동의하며 동시성 예외 관리에 대해 무엇을 잡아야하는지 명확히 알 수 없습니다. –

답변

12

DbUpdateConcurrencyExceptionDbContext에 의해 예외가 발생하므로이 값을 잡으십시오. 이 예외는 내부에있는 OptimisticConcurrencyException에 의해 발생할 수 있지만, 그렇다면이 예외는 내부 예외로 래핑됩니다.

모든 업데이트 예외가 동시성에 의한, 그래서 당신은 또한이 DbUpdateConcurrencyException 잡는 후 DbUpdateException을 잡으려고가되지는 않습니다 (후자 때문에 것은 DbUpdateException의 하위 유형입니다).

도 참조하십시오. Entity framework 5.0 handle optimistic concurrency exception?.

+0

답변 해 주셔서 감사합니다. 가장 가능성이 높은 것으로 보입니다. 두 예외를 모두 잡으려고 시도하고 어떤 일이 일어날 지 살펴 보겠습니다. 링크 주셔서 감사합니다. – Flair

+1

네, 물론 동시성 때문에 모든 예외가 발생하지는 않지만, 저는 그러한 종류의 예외에 대해서만 우려하고 있습니다. (질문에서 언급했듯이 : 데이터 상태가 db에서 변경되면 데이터와 사용자의 SaveChanges '호출). 내 목적을 위해'DbUpdateConcurrency' 예외가 충분해야한다고 생각합니까? 좀 더 구체적으로, Entity Framework의 Linq-2-SQL에서'ChangeConflictException'을 어떻게 모방합니까? – Flair

+1

'DbUpdateConcurrencyException '을 잡는 것은 timestamp/rowversion 열 또는'ConcurrencyMode.Fixed' 열 (DbContext API에있는 경우)에 의해 구성된대로 EF에서 낙관적 동시성과 관련된 모든 것을 처리해야합니다. http://msdn.microsoft.com/ko-kr/data/jj592904.aspx를 참조하십시오. 잡는 순서가 중요하기 때문에'DbUpdateException'에 대해서 언급했습니다. –

2

OptimisticConcurrencyException이 표시됩니다. this을보십시오.

이제 diffrence가 나타납니다.

  • OptimisticConcurrencyException : 낙관적 동시성 위반이 (하나 이상의 perople이 같은 결과로 변경한다고 가정하고,이 sychronized되지 않는 문제가 발생합니다) 발생
  • DbUpdateConcurrencyException을 때 발생 : 예외가 발생 예상되는 동작으로 엔티티의 SaveChanges가 데이터베이스 업데이트가 발생하지만 실제로 데이터베이스의 행에 영향을주지 않는 경우 DbContext를 사용합니다. 이는 데이터베이스가 동시에 업데이트되었으며 일치 할 것으로 예상되는 동시성 토큰이 실제로 일치하지 않음을 나타냅니다. 이 예외에 의해 참조 된 상태 항목은 보안 때문에 직렬화되지 않으며 직렬화 후에 상태 항목에 액세스하면 null이 반환됩니다.