关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”
開發(fā)環(huán)境:VS2010,SQL Server2005,Windows7,使用LINQ to SQL作為ORM
運(yùn)行環(huán)境:Windows2003(IIS6),.NET 3.5 SP1,SQL Server2000
癥狀:開發(fā)環(huán)境下一切正常,在運(yùn)行環(huán)境中出現(xiàn)如下錯誤:
?
代碼 指定的轉(zhuǎn)換無效。?說明:?執(zhí)行當(dāng)前?Web?請求期間,出現(xiàn)未處理的異常。請檢查堆棧跟蹤信息,以了解有關(guān)該錯誤以及代碼中導(dǎo)致錯誤的出處的詳細(xì)信息。?
異常詳細(xì)信息:?System.InvalidCastException:?指定的轉(zhuǎn)換無效。
源錯誤:?
執(zhí)行當(dāng)前?Web?請求期間生成了未處理的異常。可以使用下面的異常堆棧跟蹤信息確定有關(guān)異常原因和發(fā)生位置的信息。??
堆棧跟蹤:?
[InvalidCastException:?指定的轉(zhuǎn)換無效。]
???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”這一句,說明和數(shù)據(jù)庫的主鍵很可能有關(guān),于是排查有關(guān)主鍵的所有操作。最后發(fā)現(xiàn),在SQL數(shù)據(jù)庫中,有兩個表的主鍵為ID(int類型),并且沒有關(guān)聯(lián);而在LINQ to SQL中,這兩個表進(jìn)行了關(guān)聯(lián),并且關(guān)聯(lián)的字段都為非主鍵的Guid類型。于是猜測可能是LINQ to SQL對主鍵的映射出現(xiàn)了問題。
?
解決方法1:在LINQ to SQL的.dbml文件中(也可以可視化操作其屬性),將這兩個表的主鍵變?yōu)镚uid外連字段。問題解決。
解決方法2:使數(shù)據(jù)庫和LINQ to SQL同步,修改數(shù)據(jù)庫中的主鍵,并使用LINQ to SQL重新自動生成映射。
?
結(jié)論:網(wǎng)上搜了一下,似乎沒有提到這種處理方法,反而提到了和Guid相關(guān)的很多信息,可以比較肯定的是:這是一個.NET3.5中的bug,在4.0的環(huán)境中已經(jīng)解決。
總結(jié)
以上是生活随笔為你收集整理的关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC应用程序实例
- 下一篇: HTTP_POST———使用mysql_