【问题标题】:LINQ: Specified Cast is not validLINQ:指定的演员表无效
【发布时间】:2013-03-04 23:29:45
【问题描述】:

我在以下代码行中出现随机错误(100 个页面加载中的 1 个):

topic = TopicsContext.GetCurrentDataContext().tTopics.Where(t => t.ContentId == contentId).SingleOrDefault();

ContentId 属性和 contentId 局部变量都很长。

最重要的是——错误是随机发生的,在大多数情况下它都能正常工作。

提前感谢您的想法

这是完整的异常信息:

 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

【问题讨论】:

  • 生成的SQL是什么样子的?
  • 真的是随机的吗,也就是说你可以多次选择相同的数据,得到不同的结果?
  • ContentId 是外键吗?如果是,它可以为空吗?
  • 是的,ContentId 是 FK。 ContantId 不是可为空的字段
  • “它真的是随机的吗,这意味着您可以多次选择相同的数据并获得不同的结果?” - 随机我的意思是,大多数情况下这段代码工作正常并返回正确的结果,我有例外在大约 1% 的页面加载中进行了描述。

标签: linq linq-to-sql


【解决方案1】:

当我使用一个版本的数据库生成 LINQ-to-SQL 包装器并尝试将它用于不同版本的数据库时,我得到了这个。在我的情况下,定义为短的列更改为长列,并且从数据库中出来的值不能转换为长列。确保您的 LINQ-to-SQL 包装器和数据库表是同步的。

【讨论】:

    【解决方案2】:

    我认为它发生在“SingleOrDefault()”方法调用中。它的作用是,如果 (t.contentId) 存在(这应该是唯一的键,对吗?),它会给你一个答案,但是如果数据库中不存在 contentId,那么将返回默认值。 “默认”的默认值将为 null,这意味着赋值 (=) 的右侧将为 null,并且您正在尝试将 null 转换为 long。

    对于解决方案,您可以将主题设置为可空类型:

    long? topic = ....
    

    或者我将使用 "Single()" 并用 try catch 块包装以处理密钥不存在的情况。

    无论如何,应该不是程序的任何RANDOM错误。

    【讨论】:

    • 不,主题是一个tTopic,不长。 long 是 ContentId 和 contentId
    • 我添加了try catch,下次发生异常时将打印所有信息。
    • 抱歉,我没抓住重点。不过,尝试注入一个不存在的 contentId 看看会发生什么?只是想确定 singleordefault 是否会给你错误。
    【解决方案3】:

    我遇到了类似的错误,其中我有一列类型为 varchar(1) 的列映射到 char 而不是字符串。这有效,除非在将 null 转换为 char 时列值为 null 抛出“指定的转换无效”异常。

    更多详情请见http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/ac91e587-6e91-454c-9fa2-bab20b7a258c

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      相关资源
      最近更新 更多