Платформа.NET « Переодически возникает ошибка «Specified cast is not valid.» ASP.NET MVC, LINQ

На хостинге переодически выпадает ошибка "Specified cast is not valid." где-то 1 раз на 10 запросов. Выпадает всегда в разных местах кода.

Стектрейс говорит что проблема возникает при попытке linq выполнить запрос:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .csharp.geshi_code {font-family:monospace;} .csharp.geshi_code .imp {font-weight: bold; color: red;} .csharp.geshi_code .kw1 {color: #0600FF;} .csharp.geshi_code .kw2 {color: #FF8000; font-weight: bold;} .csharp.geshi_code .kw3 {color: #008000;} .csharp.geshi_code .kw4 {color: #FF0000;} .csharp.geshi_code .kw5 {color: #000000;} .csharp.geshi_code .co1 {color: #008080; font-style: italic;} .csharp.geshi_code .co2 {color: #008080;} .csharp.geshi_code .co3 {color: #008080;} .csharp.geshi_code .coMULTI {color: #008080; font-style: italic;} .csharp.geshi_code .es0 {color: #008080; font-weight: bold;} .csharp.geshi_code .es_h {color: #008080; font-weight: bold;} .csharp.geshi_code .br0 {color: #000000;} .csharp.geshi_code .sy0 {color: #008000;} .csharp.geshi_code .st0 {color: #666666;} .csharp.geshi_code .st_h {color: #666666;} .csharp.geshi_code .nu0 {color: #FF0000;} .csharp.geshi_code .me1 {color: #0000FF;} .csharp.geshi_code .me2 {color: #0000FF;} .csharp.geshi_code span.xtra { display:block; }

[InvalidCastException: Specified cast is not valid.]
   System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +847
   System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +113
   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +344
   System.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute(Expression expression) +49
   System.Linq.Queryable.SingleOrDefault(IQueryable`1 source, Expression`1 predicate) +301
   KobeAdmin.Models.UsersRepository.Get(String UserName) +399
 


Встречался ли кто-нибудь с подобной ерундой? Что можно предпринять?

1 ответов


Как показала практика проблемы такого типа достаточно сложно решать. Поэтому постараюсь описать как её решили мы, и какие способы решения бывают.
1. Для каждого request свой datacontext. Более подробно здесь. В нашем случае правда это не помогло, но народ пишет что в каких-то случаях лечит.
2. Не писать на view linq выражения которые предполагают обращения в базу. Нам повезло, у нас такое выражение было всего в одном месте. После того как перенесли эти вычисления в контроллер и нагрузили проект, ошибка чудесным образом испарилась.
3. Потом мы решили подвергнуть кэшу все что только возможно, и ошибка опять полезла при малейших нагрузках, и нам было очень плохо. Поэтому никогда не кешируте linq последовательности с отложенным выполнением. Иными словами вот так делать нельзя


var catalog = _cache.Get<IEnumerable<e_Catalog>>("category_all", () => _dataContext.e_Catalog.AsEnumerable());
 
а вот так можно

var catalog = _cache.Get<IEnumerable<e_Catalog>>("category_all", () => _dataContext.e_Catalog.ToList());
 

Скорее всего где-то из базы приходит NULL.
Чтобы детальнее разбираться, необходим Linq запрос, маппинги и структура базы.