LINQ:指定的强制转换无效

时间:2009-07-06 14:35:38

标签: linq linq-to-sql

我在以下代码行中出现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

3 个答案:

答案 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