2013-04-05 3 views
1

나는 내 마음에 꽤 오랜 시간 동안이 생각을 가지고 있고 나는 여전히 어떤 대답도 찾을 수 없다. 내 DbContext는 UnitOfWork 클래스에 의해 처리됩니다. 그래서 나는 savechanges가 발생하는 한 곳을 가지며 그 모든 불쾌한 예외를 잡아서 한 곳에서 처리합니다.엔티티 프레임 워크 예외

그러나 널리 알려져 있기 때문에 DbContext는 SaveChanges() 메서드 이외의 다른 위치에 다른 유형의 예외를 throw 할 수 있습니다. 예를 들어 엔티티를 구체화 할 때. 그러나 이것은 많은 곳에서 발생할 수 있으며, 모든 FirstOrDefault() 또는 ToList() 호출에서 try catch 블록을 작성하고 예외를 포착하고 다시 throw하는 것은 종종 오버 헤드입니다. 이 예외는 SQL 형식 일 수 있습니다. 즉, 연결을 열 수 없거나 EntityCommandExecutionException 또는 기타를 의미 할 수 있습니다.

그래서 거기에 예외가 발생하면 DbContext 개체를 발생시키는 모든 이벤트가 궁금 해서요, 그래서 해당 이벤트에 가입하고 이러한 시나리오에서 일부 논리를 처리 할 수 ​​있습니다. :)

답변

2

아니요, 없습니다.

  1. 예외가 의도적으로 발생 될 수 있지만, 그들은 또한 단지 EF의 소스 코드와 버블 어딘가에 발생할 수 있습니다 그리고 (적어도) 세 가지 이유를 들어, 수 없습니다 않습니다. 전자의 경우에는 일 수 있으며, 후자의 경우는 발생하지 않습니다. 그러므로 절대 안전하지 않을 것입니다.

  2. 이벤트는 어떻게 해고해야합니까? 이벤트를 던지는 방법에는 여러 가지가 있습니다. 그 중 하나는 catch 블록에 re-throw입니다. catch 블록에서 event을 발사하면 과 같은 소리가납니다. 나쁜 습관입니다. catch 블록은 안전하고 안정적인 코드를 포함해야합니다. catch 블록에서 예외가 발생하면 상황이 나 빠지게됩니다. 누군가가 내 catch 블록에 어떤 종류의 코드를 연결할 수 있다면 그것은 나에게 매우 나쁜 느낌을 줄 것입니다.

  3. 이벤트는 언제 해고되어야합니까? 일부 예외는 EF 어셈블리 내에서 으로 처리 될 수 있습니다. 당신은 아마 그것이 일어났다는 것을 알고 싶지도 않을 것입니다. 그러나 다른 시나리오에서는 같은 예외가 발생할 수 있습니다.

+0

우선, 답변 해 주셔서 감사합니다. 이 경우 시간 제한과 같은 예외를 처리하는 방법에 대한 링크 나 키워드를 제공하십시오. 중앙 집중식으로 연결 (DbUpdate 및 동시성 옆의 다른 탭)을 열 수 없습니다. – vuckovikmarko

+1

여기에 몇 가지 아이디어가 있습니다. (http://stackoverflow.com/questions/3699799/is-there-a-centralised-error-handling-process-in-c-sharp) 결론은 다음과 같습니다. 당신이 거품을 내고 싶지 않은 곳에서 그들을 처리하십시오, 그래서 당신은 항상'try-catch' 블록을 가질 것입니다. –