2016-08-26 2 views
1

저는 Entity Framework 6을 사용하여 EF를 통해 Primary/Foreign/Unique Key 제약과 같은 몇 가지 공통적 인 문제를 처리하려고했습니다. EF는 으로 SqlException을 제공합니다. 지금까지 발견 한 바에 따르면 실제 문제를 이해하는 유일한 방법은 SqlException 개체의 오류 코드를 사용하는 것입니다.SqlExceptions 추상화 (Entity Framework 사용)

나는 이러한 예외를 EF 예외를 포착하고 InnerException의 오류 코드를 분석하여 예외를 던져서 추상화하려고합니다. 그 시점에서 몇 가지 고려 사항이 있습니다.

  1. SQL Server 코드는 서버 버전에 따라 달라 지거나 변경되지 않습니까? 다른 버전의 SQL Server를 다른 방식으로 처리해야 2008, 2012 등의 다른 구현을 만들 수 있습니까?

  2. SQL Server 대신 MySQL과 같은 다른 SQL Server를 사용할 수 있으며 이러한 이유 중 하나는 예외를 추상화하려고합니다. 예를 들어

that 질문의 허용 대답에, 나는 캐치 특정 오류를 싶지만, 대신 rethrowing의 나는 내 자신의 예외 (들)을 던져 싶습니다. 특수한 작업을 수행하고 싶지 않거나 오류에 대한 특별한 예외가없는 경우 원래 예외를 해당 일반 예외 InnerException 필드에 저장할 수있는보다 일반적인 예외를 만들고 사용할 수 있습니다.

나는 블로그 게시물 this을 읽었으며 불행히도 문제의 경우는 나의 첫 번째 방법이었습니다. 가능한 한 제 3 자 라이브러리를 사용하지 않고이 작업을하고 싶습니다. (물론 이것이 더 중요하지는 않습니다.) 나는이 일을하는 데 시험되고 받아 들여지는 방법이 있는지 궁금해합니다. 그렇지 않으면 어떤 제안이든 열려 있습니다.

+0

하지만 수정해야 할 코드에 제약 조건 같은 것이 있습니까? 따라서 예외를 잡기를 원하지는 않을 것입니다. –

+0

아니요 가능할 때마다 복구하고 싶습니다 (예 : 클라이언트가 데이터베이스에있는 사용자를 추가하려고합니다). 그러나 EF 예외는 오류 코드만큼 세부 정보를 알려주지 않습니다. 이러한 오류 코드를 해석하고 EF 코드 대신 내 자신의 예외를 던지고 싶습니다. 그게 명확한가요? – Deniz

+0

그래, 내가 무슨 말하는지 알 겠어. 당신이 덮어 씌우지 않았는지, 앱이 정말로 추락하고 싶다는 오류가 있는지 확인해야 해. –

답변

1

SQL Server 코드는 서버 버전에 따라 변경되거나 삭제되지 않으십니까?

한 번 출시 된 예외 번호는 변경할 수 없습니다. 교착 상태가 있으며 1205, 고유 색인 중복 키가 남아 있으며 2601으로 유지되며 고유 제약 조건 위반은 2627 등으로 유지됩니다. 그러나, 당신이 본 바로는 예를 들자면 나는 이것들에 의존하면서 숨어있는 위험을 보여줍니다 : 2601과 2627의 차이를 결정 짓는 것은 무엇입니까? 친숙한 DBA는 고유 인덱스를 삭제하고 대신 고유 제한 조건을 추가해야한다고 결정할 수 있습니다 (인덱스로 시행하지만 관련이 없으며 갑자기 앱에 새로운 오류가 표시됨). 예외를 자세히 조사하면 응용 프로그램 코드와 SQL 저장소 사이의 결합이 추가되고 저장소가 변경되면 완전히 투명하게 변경 될 수있는 응용 프로그램이 손상 될 위험이 있습니다 (예 : 색인 추가). 경고 받다.

몇 가지 잘 알려진 사례에 대한 처리를 추가하는 것이 가능하다고 생각합니다. 그러나 광고 개발 시간을 알지 못하는 일반적인 예외를 허용하고이를 처리해야합니다.

크로스 플랫폼의 경우 각 플랫폼에 맞게 사용자 정의해야합니다. 좋은 소식은 '기본 키 위반'은 SQL Server와 MySQL에서 동일한 개념이므로 두 공급자 모두에 대해 PrimaryKeyViolationException으로 변환 할 수 있다는 것입니다. 사소한 것이 아니라 가능합니다.

그리고 마침내 머리가 위로 올라갑니다. 전에 비슷한 결과를 얻으려는 사람들을 보았습니다. 그 혜택은 엄청난 것이 아니며 많은 노력이 필요합니다.

+0

우리는 데이터베이스에 대한 통제권을 가지고 있기 때문에 우리는 운이 좋다. 오류 코드에 대한 귀하의 우려를 이해하며 귀하가 옳다고 생각합니다. 바라건대, 나는 다양한 오류 케이스를 다룰 필요가 없으며 몇 가지 예외를 제외하고는 일반적인 예외를 만들거나 던질 수있다. 나는 적당한 무엇인가 계속하기 위해 이익과 노력의 균형을 맞추려고 노력하고 있습니다. – Deniz

관련 문제