Что вызвало это InvalidOperationException, используя LINQ to SQL? - PullRequest
6 голосов
/ 22 августа 2011

Неделю или две назад мы столкнулись с рядом ошибок в нашем живом приложении, которые до сих пор не получили объяснения.Мы видели эти ошибки внутренне, и они также испытывались клиентами, поскольку они проявлялись в наборе веб-сервисов.

Я включил внутреннее исключение ниже, проект использует структуру CSLA, и ошибка произошла при получении объектаиз базы данных.

В то время, когда мы начали испытывать ошибки, в систему не было внесено никаких известных изменений, инфраструктура состоит из ряда веб-серверов с балансировкой нагрузки.

Казалось, что ошибкиизолированные от одного из наших серверов, мы испытали их с помощью консольного приложения, подключающегося к веб-сервисам.Рассматриваемый сервер использовал локальный IP-адрес DMZ для разрешения веб-сервисов в своем файле hosts, и, заставляя это работать извне, казалось, что он решает проблемы.

Кажется, что между приложением и приложением очень тонкая граньинфраструктуры, чтобы изолировать это, поэтому Мне интересно, есть ли у кого-нибудь какие-либо идеи или теории, которые могли бы объяснить это ?

<InnerException>
      <ExceptionType>System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
      <Message>Exception of type 'System.InvalidOperationException' was thrown.</Message>
      <Source>mscorlib</Source>
      <HelpLink />
      <Property name="Data">System.Collections.ListDictionaryInternal</Property>
      <Property name="TargetSite">Void VerifyIntegrity()</Property>
      <StackTrace>   at System.Runtime.CompilerServices.ConditionalWeakTable`2.VerifyIntegrity()
   at System.Runtime.CompilerServices.ConditionalWeakTable`2.Add(TKey key, TValue value)
   at System.Linq.Expressions.Expression..ctor(ExpressionType nodeType, Type type)
   at System.Data.Linq.SqlClient.Translator.TranslateLink(SqlLink link, List`1 keyExpressions, Boolean asExpression)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.ConvertToFetchedExpression(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.ConvertLinks(SqlExpression node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.FetchExpression(SqlExpression expr)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitMember(SqlMember m)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitNew(SqlNew sox)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitAlias(SqlAlias a)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource source)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope(SqlIncludeScope scope)
   at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
   at System.Data.Linq.SqlClient.SqlBinder.Bind(SqlNode node)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, ReadOnlyCollection`1 parentParameters, SqlNodeAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
   at NamespaceA.DaSql.NamespaceB.NamespaceBContext.NamespaceA.Da.NamespaceB.INamespaceBContext.GetClassA(Int32 objectId)
   at NamespaceA.NamespaceB.ClassA.DataPortal_Fetch(SingleCriteria`2 criteria)
   at dm(Object , Object[] )
   at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters)</StackTrace>
    </InnerException>

Заранее благодарю за любую помощь или теории.

Редактировать:

Полное исключение - здесь

LINQ к SQL ниже, ничего к нему, и ObjectA - просто класс-обертка ссвойства.Ничто иное, как простой выбор и заполнение одного объекта, основывается на идентификаторе.ctx - это CSLA ContextManager.

var data = from d in ctx.DataContext.ObjectAs
                           where d.ObjectId == objectId
                           select new ObjectA
                            {
                                Id = d.DispatchId,
                                ClientId = d.ClientId,
                                DateCreated = d.DateCreated
                            };

                return data.SingleOrDefault();

Ответы [ 3 ]

2 голосов
/ 08 октября 2011

Я вижу внутреннее исключение, которое вы прикрепили, и, как исключение, может быть проблема с вашей коллекцией, которая создается, когда выполняется метод SingleOrDefault () (LINQ - отложенное выполнение).

Я публикую 2 ссылки, которые могут помочь вам лучше проанализировать проблему и ее решение, если вы немного углубитесь в создание коллекции. Надеюсь, что эти ссылки помогут вам решить вашу проблему:

Ссылка 1: http://typedescriptor.net/browse/members/289638-System.Runtime.CompilerServices.ConditionalWeakTable%602%5BTKey,TValue%5D.VerifyIntegrity()

Ссылка 2: http://code.google.com/p/bclcontrib-abstract/source/browse/%2BFromCoreEx/%2BKludge/Runtime/CompilerServices/ConditionalWeakTable.cs?spec=svnd7b68d68e34be8e5db308feaccf935afd2c1b8d9&name=d7b68d68e3&r=d7b68d68e34be8e5db308feaccf935afd2c1b8d9

Методами-виновниками могут быть ConditionalWeakTable.Add () и ConditionalWeakTable.VerifyIntegrity ()

Выше указатели должны помочь вам найти решение. Спасибо

0 голосов
/ 08 октября 2011

Я бы поставил точку останова на линии

return data.SingleOrDefault();

.Затем наведите курсор мыши на data , чтобы оценить его и посмотреть, возвращает ли он то, что вы ожидаете.Это может показать, что было сгенерировано исключение.Если исключение не выдается, попробуйте оценить data.SingleOrDefault () , либо наведя курсор мыши, либо добавив выражение наблюдения, и посмотрите, не получите ли вы исключение.разделите запрос на один фрагмент для каждого шага и оцените на каждом шаге, чтобы определить, какой из вызовов вызывает исключение.

Пример:

// break execution and evaluate each one separately
var table = ctx.DataContext.ObjectAs;
var filter = table.Where(x => x.ObjectId == objectId);
var select1 = filter.Select(x => x.DispatchId);
var select2 = filter.Select(x => x.ClientId);
var select3 = filter.Select(x => x.DateCreated);
var select4 = filter.Select(x => new ObjectA
                  {
                            Id = d.DispatchId,
                            ClientId = d.ClientId,
                            DateCreated = d.DateCreated
                  };
var singleOrDefault = select4.SingleOrDefault();

.вашего запроса вызывает проблему.

0 голосов
/ 04 октября 2011

Я думаю, что, как показано в документации msdn , InvalidOperationException может быть выброшено, если метод SingleOrDefault() вызывается в последовательности, содержащей более одного элемента, возможно, вы могли бы использовать FirstOrDefault()вместо этого

Надеюсь, это поможет.

...