关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”
时间:2010-10-21 来源:SZW
运行环境:Windows2003(IIS6),.NET 3.5 SP1,SQL Server2000
症状:开发环境下一切正常,在运行环境中出现如下错误:
代码 指定的转换无效。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidCastException: 指定的转换无效。
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
[InvalidCastException: 指定的转换无效。]
System.Data.Linq.SingleKeyManager`2.TryCreateKeyFromValues(Object[] values, V& v) +59
System.Data.Linq.IdentityCache`2.Find(Object[] keyValues) +28
System.Data.Linq.StandardIdentityManager.Find(MetaType type, Object[] keyValues) +23
System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues) +48
System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance) +142
System.Data.Linq.ChangeProcessor.BuildEdgeMaps() +254
System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +59
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +331
System.Data.Linq.DataContext.SubmitChanges() +19
Senparc.Web.Admin.ProductEdit.btnSubmit_Click(Object sender, EventArgs e) +847
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
分析原因:
注意到“System.Data.Linq.IdentityCache`2.Find(Object[] keyValues) +28”这一句,说明和数据库的主键很可能有关,于是排查有关主键的所有操作。最后发现,在SQL数据库中,有两个表的主键为ID(int类型),并且没有关联;而在LINQ to SQL中,这两个表进行了关联,并且关联的字段都为非主键的Guid类型。于是猜测可能是LINQ to SQL对主键的映射出现了问题。
解决方法1:在LINQ to SQL的.dbml文件中(也可以可视化操作其属性),将这两个表的主键变为Guid外连字段。问题解决。
解决方法2:使数据库和LINQ to SQL同步,修改数据库中的主键,并使用LINQ to SQL重新自动生成映射。
结论:网上搜了一下,似乎没有提到这种处理方法,反而提到了和Guid相关的很多信息,可以比较肯定的是:这是一个.NET3.5中的bug,在4.0的环境中已经解决。
相关阅读 更多 +