zoukankan      html  css  js  c++  java
  • 关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”

    开发环境:VS2010,SQL Server2005,Windows7,使用LINQ to SQL作为ORM

    运行环境: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的环境中已经解决。

  • 相关阅读:
    html5-1 网页结构描述
    [搜索] hdu 4016 Magic Bitwise And Operation
    备忘录模式设计模式入门Memento
    编译的依赖不能vs的release工程
    【web开发学习笔记】Structs2 Action学习笔记(两)
    ios学习网络------4 UIWebView以三种方式中的本地数据
    坑爹BUG,没有详细的看还真看不出问题
    《Effective C++》:规定44-规定45
    [ACM] poj 1088 滑雪 (内存搜索DFS)
    Balanced Binary Tree(Java代码没有结束,是什么原因???)
  • 原文地址:https://www.cnblogs.com/szw/p/1857790.html
Copyright © 2011-2022 走看看