【问题标题】:"Specified cast is not valid" error when saving LINQ-To-SQL entity保存 LINQ-To-SQL 实体时出现“指定的转换无效”错误
【发布时间】:2011-01-26 04:14:05
【问题描述】:

应用详情: C#、ASP.NET MVC、SQL Server 2008(相同版本和 SP 级别)、Linq-To-SQL ORM

我正在尝试诊断我收到的异常:

“指定的演员表无效。” 在 System.Data.Linq.IdentityManager.StandardIdentityManager.SingleKeyManage`2.TryCreateKeyFromValues(Object[] values, V&v)
在 System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues)
在 System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType 类型,Object[] keyValues)
在 System.Data.Linq.CommonDataServices.GetCachedObject(MetaType 类型,Object[] keyValues)
在 System.Data.Linq.ChangeProcessor.GetOtherItem(元关联关联,对象实例)
在 System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
在 System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
在 System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
在 System.Data.Linq.DataContext.SubmitChanges()
在 Repository.Save() 在等......

问题在于,这只发生在我们的服务器上,而不是我们的本地开发机器上。我已经追踪到我们正在修改的单个属性:

event.SalesForceId = "701Q0000000AOTIIA4";

如果我注释掉那行,一切正常。

我试过了:

1 ) 在服务器上打蜡并重新部署所有代码。同样的问题。
2)拉下服务器数据库的副本并在本地尝试。工作正常。
3 ) 尝试我们在同一个盒子上设置的另一个 IIS 环境。同样的问题。
4)物理比较(使用 AdeptSQL)本地和远程模式。没有区别。
5)验证两列(本地和远程)的数据类型是否相同。此外,此列是另一个表的 FK。我验证了两者都是相同的数据类型,直到排序规则。

服务器是 Windows Server 2008,本地机器是 Windows 7 x64。两者都有所有重要的更新设置。

我唯一能想到的可能是因为数据库和 Web 服务器位于不同的盒子上,这可能是个问题?否则,我完全被难住了。

有什么想法吗?

【问题讨论】:

  • 最后一次通话中V 的类型是什么?使用调试器查看。
  • 这是应用了所有服务包的 .net 3.5,而不是 4。另外,我不能使用调试器来单步调试它,因为它在服务器上。远程调试也不是一种选择。

标签: c# asp.net-mvc sql-server-2008 linq-to-sql


【解决方案1】:

【讨论】:

  • 我下载了 963657 并尝试安装它,但它给了我以下错误:此软件更新解决的产品均未安装在此计算机上。单击取消退出设置。这是因为 963657 适用于框架 3.5 SP1,但我使用的是框架 3.5。
【解决方案2】:

如果该键存在于已定义的关系中并且该对象已创建,则必须使用 LINQ 提供的关系路径 (obj.Foo = new Foo { ... })。 (即使对于新对象,我也会使用提供的关系)。不这样做会导致——根据经验——出现类似的“随机”错误。

另一个可能导致该错误(或非常相似的错误)的问题是反向关系列,用于复合关系。但是,如果生成的代码相同并且数据库相同(实际上,在两个帐户上),那么我怀疑第一个原因是罪魁祸首。

SQL 到 LINQ 的坑坑洼洼跳跃愉快。

【讨论】:

  • 有趣,但在这些情况下,我通常拥有“正常”NullReferenceException IIRC。如果我们能找出它无法投射的原因(我假设是string),那将会很有帮助。
  • @leppie 如果我能找到一本处理 LINQ 错误的“食谱”,我很乐意放弃我最喜欢的袜子:-/
  • +1 我也想要一个。通常,如果我可以附加到进程并使用调试器,那么找出内部发生的事情并不难(当然还有 Reflector 的一点帮助),然后追溯到问题(查看状态/托管堆栈中的本地人)。
  • 对象还不存在。原代码sn-p中的“event”是FK中被引用的对象。所以引用对象将在以后出现。此外,这仅发生在特定环境中,而不是无处不在。这就是为什么它如此令人费解。
  • @leppie:完全正确。起初我假设 db / dbml / 生成的 .cs 文件中存在一些类型不匹配。但一切都是字符串。
猜你喜欢
  • 1970-01-01
  • 2012-01-15
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多