使用LINQ to SQL导致InvalidOperationException的原因
本文关键字:InvalidOperationException 导致 LINQ to SQL 使用 | 更新日期: 2023-09-27 18:06:25
一两周前,我们在实际应用程序中遇到了一些至今无法解释的错误。我们在内部看到了这些错误,客户端也经历了这些错误,因为它表现在一组web服务中。
我在下面包含了内部异常,该项目使用CSLA框架,并且在从数据库检索对象时发生错误。
当我们开始遇到错误时,系统没有任何已知的变化,基础设施由许多负载平衡web服务器组成。
错误似乎是孤立于我们的一个服务器,我们使用控制台应用程序连接到web服务。有问题的服务器使用本地DMZ IP来解析其hosts文件中的web服务,并且通过将其强制到外部,似乎可以解决问题。
应用程序和基础设施之间似乎有一条非常细的界限来隔离这一点,所以我想知道是否有人有任何想法或理论可以解释这个?
<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 to SQL,对它没有任何影响,ObjectA只是一个带有属性的包装类。仅仅是根据ID对一个对象进行简单的选择和填充。
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();
我看到了你所附加的内部异常,根据异常,可能是你的集合有问题,这是在SingleOrDefault()方法执行时创建的(LINQ延迟执行)。
我发布了两个链接,如果你深入挖掘收集创建,可能会帮助你更好地分析问题和解决方案。希望这些链接能帮助你解决你的问题:
Link1: http://typedescriptor.net/browse/members/289638-System.Runtime.CompilerServices.ConditionalWeakTable%602%5BTKey, TValue % 5 d.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()
以上几点应该能帮助你找到解决办法。由于
我认为正如msdn文档中所示,如果方法SingleOrDefault()
在包含多个元素的序列中被调用,则可能会抛出InvalidOperationException
,也许您可以使用FirstOrDefault()
代替
我会在
return data.SingleOrDefault();
。然后,将鼠标移到data上计算它,看看它是否返回您所期望的结果。它可能显示抛出了异常。如果没有抛出异常,请尝试将鼠标移到data.SingleOrDefault()上或通过添加watch表达式来计算,看看是否会出现异常。
您还可以为每一步将查询分离为单个部分,并在每一步求值以确定是哪个调用导致了异常。
,
// 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();
这将缩小查询的哪一部分导致问题。