2014-07-11 4 views
1

문자열 필드가 너무 긴 EF 6.01 SaveChanges를 통해 SQL 2012 데이터베이스를 업데이트 할 때 예상대로 예외가 발생합니다. 내가 무엇을하고 싶은지는 가장 깊은 SqlException이 단지 나를 알려주 듯이 문제를 일으키는 테이블과 컬럼을 찾기 위해 Exception으로 들어가는 것이다. -EF 6.01에서 DbEntityValidationException 예외를주지 않는 이유는 무엇입니까?

문자열 또는 바이너리 데이터가 잘릴 것이다.

그러나 어떤 열이나 테이블이 아닙니다. 나는 아래와 같은 코드를 가지고 어떤 유효성 검사 오류에 대해서도 말할 준비가되어 있지만 그런 예외는 얻지 못한다.

catch (DbEntityValidationException dbEx) 
{ 
    foreach (var validationErrors in dbEx.EntityValidationErrors) 
    { 
     foreach (var validationError in validationErrors.ValidationErrors) 
     { 
      Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
     } 
    } 
} 

예외는 SqlException을 포함하는 UpdateException을 포함하는 DbUpdateException으로 중첩되어 있으며 이들 중 어느 것도 열 정보를 갖고 있지 않습니다. 왜 DbEntityValidationException을 얻지 못합니까? 문제를 일으키는 열을 찾을 수있는 다른 방법이 있습니까?

답변

1

이 예외는 SQL에서 직접 나오고 Entity Framework를 통해 전달됩니다. DbEntityValidationException에 대한 MSDN에서 :

이 SaveChanges를 (에서 던진 예외)을 나타냅니다 기관의 검증을 실패 할 때.

(강조 내 자신). Entity Framework의 유효성 검사는 성공하지만 실제 SQL 문은 전달하는 데이터가 한 열에 비해 너무 길기 때문에 실패합니다. SQL은 잘린 열을 리턴하지 않습니다. 그것은 '문자열 또는 바이너리 데이터가 잘리는 일반 텍스트 메시지입니다.'

가장 좋은 방법은 열을 살펴보고 코드의 문자열 길이가 SQL 열에 설정 한 길이와 일치하는지 확인하는 것입니다.

+0

이 경우 어떤 항목이 문제를 일으켰는지 알지만 나중에 쉽게 알려주도록 코드를 추가하고 싶습니다. EF가 SQL에 제공하기 전에 항목을 확인하도록 할 수 있습니까? 컨텍스트에 3 개의 객체를 추가하고 나서 SaveChanges를 수행합니다. – Dave

+0

@Dave 어떤 방법론을 사용하고 있습니까? 코드 첫 번째? 데이터베이스 우선? –

+0

Steven, Model First를 사용 중이며 MSFT가 Model First를 버렸기 때문에 Code First로 변환하는 프로젝트가 있습니다. – Dave

0

EF 유효성 검사가 어떤 이유로 든 수행되지 않았으므로 분명히 DbEntityValidationException이 발생하지 않으므로 TxRepository.Commit을 통해 SaveChanges를 수행하기 전에이 코드를 추가하고 ValidationErrors가 포함 된 사용자 지정 EfValidationException을 던집니다. 테스트를 마쳤습니다. 문제가있는 컬럼을 기록 할 수있게되었습니다.

  // validate the changes 
      var lTxValidationErrors = TxRepository.mDbContext.GetValidationErrors(); 
      if (lTxValidationErrors.Count() > 0) 
      { 
       // these changes will not commit so throw an error 
       throw new EfValidationException(lTxValidationErrors); 
      } 
      else 
      { 
       // commit the new data to the database 
       TxRepository.Commit(); 
      } 
+0

이것은 나에게 유용한 해결책입니다. 누군가 내가 처음에 DbEntityValidationException을 얻지 못한 이유와 왜 다른 사람이 여기에서 알 수 있듯이이 예외를 얻는 이유를 말할 수 있다면 대답으로 응답을 표시하는 것이 더 좋을 것입니다. – Dave