2011-11-08 4 views
0

매우 이상한 캐스트 예외가 발생했습니다. 매우 드물게 예외가 발생합니다.이상한 Linq 캐스트 예외

protected Guid GetWebsiteLanguage(Guid websiteId, int languageId) 
    { 
     Guid websiteLanguagesId = Guid.Empty; 
     var websites = from item in DataContext.WebsiteLanguages 
         where item.WebsiteId == websiteId && item.LanguageId == languageId 
         select item.Id; 

     if (websites.Count() != 1) 
      throw new ArgumentException("Wrong channel parameters."); 

     try 
     { 
      websiteLanguagesId = websites.First(); 
     } 
     catch (Exception ex) 
     { 
      string errorMessage = websites.First() == null ? "websites.First() is null" : string.Concat("Invalid Guid ", websites.First().ToString()); 
      throw new Exception(string.Concat(ex.Message, " - Log: ", errorMessage, " - Variables: websiteId = ", websiteId.ToString(), " languageId = ", languageId)); 
     } 

     return websiteLanguagesId; 
    } 

내가 얻을 예외는 이것이다 :

지정한 캐스트가 유효하지 않습니다

는 코드입니다. - 로그인 :

잘못된 가이 ef058612-37db-4b02-aa13-5a528819a5e0

변수 : 은 =이

의 LanguageID = 2057

이것은-4fd0-b344-55bbf17a5c15 db725f45-70fa입니다 websiteId catch의 예외 출력. 보시다시피 GUID가 있지만 여전히 캐스트 예외를 제공하고 있습니다 ...

가끔이 함수의 Count()가 잘못되었습니다. 그런 다음 스택 추적입니다.

System.Data.Linq.IExecuteResult Execute (System.Linq.Expressions.Expression, QueryInfo, System.Data.Linq.SqlClient.IObjectReaderFactory, System.Object [], System.Object [] , System.Data.Linq.SqlClient.ICompiledSubQuery [], System.Object) STACKTRACE : System.Data.Linq.SqlClient.SqlProvider.Execute에서 (식 쿼리, QueryInfo queryInfo, IObjectReaderFactory 팩터 리, Object [] parentArgs, Object [] userArgs) , ICompiledSubQuery [] subQueries, Object lastResult) System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (식 쿼리, QueryInfo [] queryInfos, IObjectReaderFactory 팩터 리, ObjectArguments, ICompiledSubQuery [] 하위 쿼리)에서 System.Data에 Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (식 쿼리) at System.Data .Linq.DataQuery 1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable 1 원) GetWebsiteLanguage에서 (GUID websiteId, INT32의 LanguageID)

그리고이 유일한 해결책을 occures 때 IIS 응용 프로그램 풀 재활용을 수행하고 다시 노력하고 있습니다.

아이디어가 있으십니까?

이 내가 문제의 원인이 무엇인지 확실하지 않다, 내가 잘 내 데이터 컨텍스트

public MyDataContext DataContext 
    { 
     get 
     { 
      //Changed this to make this testable with unit tests 
      if (HttpContext.Current != null) 
      { 
       if (!HttpContext.Current.Items.Contains(DataContextKey)) 
        HttpContext.Current.Items.Add(DataContextKey, new MyDataContext(ConnectionString)); 
       return (MyDataContext)HttpContext.Current.Items[DataContextKey]; 
      } 
      else 
      { 
       //When context is not available 
       if (context == null) 
        context = new MyDataContext(ConnectionString); 
       return context; 
      } 
     } 
    } 

답변

1

을 처리하는 방법입니다. 그러나 나는 alwas가 단지 하나의 결과를 가질 수 있다고 당신을 이해합니다. 그래서 카운트를 전혀 사용하지 않는 것으로 간주 했습니까? 또한 코드의 후반 부분에있는 First()는 null이 될 수 없다고 생각합니다.

는 왜() SingleOrDefault를 사용으로 리팩토링하지 :

var websites = (from item in DataContext.WebsiteLanguages 
        where item.WebsiteId == websiteId && item.LanguageId == languageId 
        select item.Id).SingleOrDefault(); 

(하나 개 이상의 결과를 가질 수 있다면, FirstOrDefault 대신 사용)를 계속

if (websites == null) 
     throw new ArgumentException("Wrong channel parameters."); 
+0

이것이 문제를 해결할 수 있는지는 알 수 없습니다 ... 예외는 종종 카운트에서는 발생하지만 웹 사이트에서는 다른 시간 때문에 발생합니다.먼저(); 표현식 .. 그리고 만약 그것이 First() 표현식에 잘못되어 있다면 매우 이상합니다. 예외에 값이 있습니다. (예제에 표시된대로) – user1035498

+0

그리고 재현 가능합니까? 즉, 동일한 풀을 재활용하려고 시도한 후 동일한 GUID가 작동하지 않거나 일관성이 없습니까? – Pleun

+0

그리고 당신은 당신의 문제를 해결하지 못할 수도 있습니다 (비록 당신은 아마 다른 SQL이 생성 될 것입니다). 하지만이 같은 리팩토링은 여전히 ​​성능을 향상시킬 것입니다. – Pleun

0

나는 동일한 문제를 가지고 Server Data Type 속성을 내 DBML에 uniqueidentifier으로 설정하여 해결했습니다.