2009-10-04 60 views
1

在我的机器一切正常,但是当我把它发布到服务器,我得到System.InvalidCastException:将在LINQ记录时,SQL

System.InvalidCastException指定的转换是无效的:指定转换无效

这是发生在

db.SubmitChanges(); 

我已经检查了https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=351358,它仍然使我的错误

我也跑了Windows更新和一切都是最新的服务器

+0

您的开发SQL Server是否与生产SQL Server的版本相同?(即2005年或2008年等)? – Pwninstein 2009-10-04 16:25:38

回答

1

好吧,我已经解决了这个问题。

看起来问题是,我的表有Id作为Int和主键,也有GUID作为定义为Unique的字段,而Guid字段是另一个表的键并正在使用作为外键。

当我将Guid字段设置为表中的主键时,问题就消失了。

,因为我们

2

你不说你要提交给数据库,所以我建议任何东西将(受过教育的)猜测。但是,想到的事情是检查你的机器和服务器上的日期格式。 这可能位于操作系统级别或数据库级别。

如果您的机器是英国的,服务器是美国的,那么如果您有一个代表英国格式日期的字符串(例如30/9/2009),那么它会失败,因为没有30个月。

然而,正如你所说这不是这个特定的问题,寻找你的开发环境和服务器之间的差异,以突出可能是问题领域。

的事物的不完整的清单来检查:

  • 不同的操作系统。我假设你在XP/Vista上,服务器在Windows Server上。获取具有相同OS的机器并在那里调试。你的开发机器是32位还是64位的服务器(反之亦然)?
  • 不同版本的.NET运行时。确保服务器运行的是与开发机器相同的版本。
  • 其他库等。您的开发计算机上是否安装了某些您尚未安装在服务器上的东西?
+0

表中没有日期字段 它发生在所有地方不只是一个提交,大多数表没有插入,唯一没有的是非常简单的表 – Coppermill 2009-10-04 16:50:21

+0

@Coppermill - 在这种情况下为环境之间的差异。 – ChrisF 2009-10-04 17:19:09

+0

好吧我一直在进行一些测试 这两个环境都是32位 我已经将所有的开发文件复制到服务器并将连接字符串指向服务器db 我在服务器和开发中运行.net 3.5 sp1。 所有参考文件都保存在bin目录中,与我的开发框相同 我已经从Dev框连接到实时SQL数据库并且工作正常。 我有点茫然不知所措下一步该怎么做 – Coppermill 2009-10-05 15:50:55

0

您是否更改了模型中或数据库中任何列的数据类型?该异常通常是由于在L2S模型中使用的数据类型与数据库中使用的数据类型不匹配而导致的。

另外,你有任何varchar(1)或nvarchar(1)字段?如果是这样,L2S设计者将默认将这些映射到System.Char。这是不正确的映射,因为varchar(1)或nvarchar(1)可以包含空字符串,而System.Char只能包含一个字符,并且可能导致InvalidCastExceptions被抛出(尽管检索数据时通常会发生不匹配,当提交)...

+0

数据库的是一样的,SQL 2008 – Coppermill 2009-10-06 08:55:50

+0

好的。问题容易重现吗?如果是这样,写一个代码片段,在服务器上重现它。然后更新该代码片段,在SubmitChanges之前执行GetChangeSet。对变更集进行序列化并检查数据以查看是否有“有趣”的事情发生。另外,如果您可以在您的问题中包含用于创建受影响的表之一的SQL-DDL以及来自[dbmlfile] .designer.cs的DBML和/或类定义,那么可能会对到底是怎么回事... – KristoferA 2009-10-06 09:50:27

0

去住未来我还没有创建一个测试项目,证明了这一点,由于时间的限制,我打电话时面临着同样的异常:

DataContext.SubmitChanges(); 

改变一个对象后在上下文中。和它在开发机器和服务器上一样,我得到了相同的转换错误。

我有两个表使用字符串属性作为关键的关联。

要解决,我删除了关联。

0

我也有这个问题。我已更改为本地数据库,并忘记对生产数据库进行更改。