我在以下代码行中出现RANDOM错误(100次页面加载中有1次):
topic = TopicsContext.GetCurrentDataContext().tTopics.Where(t => t.ContentId == contentId).SingleOrDefault();
ContentId属性和conntentId局部变量都很长。
最重要的是 - 错误随机发生,大多数情况下都能正常工作。
提前感谢您的想法
这是完整的例外信息:
Error Message: Specified cast is not valid.
Error Source: System.Data.Linq
Error Stack Trace:
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
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 Topics.BusinessLogic.Models.Services.TopicService.GetTopic(String title) in C:\rabota\topics\source\trunk\Topics.BusinessLogic\Models\Services\TopicService.cs:line 65
答案 0 :(得分:3)
当我使用一个版本的DB生成LINQ-to-SQL包装器并尝试将其用于不同版本的DB时,我已经得到了这个。在我的例子中,一个被定义为short的列被更改为long,并且一个值来自DB,它不能转换为long。确保您的LINQ-to-SQL包装器和数据库表保持同步。
答案 1 :(得分:0)
我认为它发生在“SingleOrDefault()”方法调用中。它的作用是,如果(t.contentId)存在(它应该是一个唯一的键,对吧?),它会给你一个答案,但是如果数据库中不存在contentId,那么将返回Default值。默认值“default”将为null,这意味着赋值(=)的右侧将为null,并且您尝试将null转换为long。
对于解决方案,您可以将主题设置为可空类型:
long? topic = ....
或者我将使用“Single()”并用try catch块包装来处理密钥不存在的情况。
无论如何,该程序不应该是任何RANDOM错误。
答案 2 :(得分:0)
我遇到了类似的错误,我有一个varchar(1)类型的列,它被映射到char而不是string。除非在将null转换为char时将列值设为null,否则这种方法有效,因为“指定的转换为无效”异常。
有关详细信息,请参阅http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/ac91e587-6e91-454c-9fa2-bab20b7a258c。