2013-03-07 85 views
0

運行我在生產服務器或其他開發人員計算機上編寫的代碼時,它會在此行上崩潰。使用LINQ to SQL和sqlmetal的C#錯誤System.InvalidCastException:指定的轉換無效

Ac_CalcDetail xy = db.Ac_CalcDetails.Where(chld => chld.CalcIdent.Equals(CalcIdent)).First(); 

CalcIdent只是一個字符串guid。

我已經在我的本地數據庫上運行sqlmetal,其中Ac_CalcDetail是我們的主表,用於創建此強類型代碼和類Ac_CalcDetail。問題是當我在生產服務器上或其他開發人員的機器上運行代碼時。我們一直在使用LINQ已經有一年多的時間了,從來沒有任何問題如此困惑。以前我得到的例外非常明確地說明哪個字段缺失,這是非常明智的,但是從我的研究顯然這個錯誤可能是某個字段有錯誤的數據類型。噩夢和完全不可能通過這個錯誤進行調試。

我認爲目前唯一的解決方案是在SQL Server Management Studio中備份數據庫,然後讓其他人使用它。由於我們是一家小公司,我們傾向於只爲自己的數據庫做我們想做的事情,然後創建各種SQL腳本放在Dropbox文件夾中以使我們的數據庫同步(或者至少是我們認爲同步的)。不知道這是否意味着我們要麼停止使用LINQ,要麼開始使用一些更高級的SQL東西(SQL存儲庫或SQL數據庫比較工具等)。

雖然這很奇怪,但我知道我們的數據庫並沒有完全相同的年齡(如果有的話),所以不知道爲什麼這個錯誤現在正在發生,爲什麼錯誤信息什麼也沒說!

+0

什麼類型是'Ac_CalcDetails'和什麼類型是'CalcIdent'? – SpaceBison 2013-03-07 14:02:52

+0

在上面的C#代碼行中CalcIdent是一個字符串。在數據庫中它是唯一標識符。我不認爲這是問題,但其他開發人員使用我的數據庫時沒問題。 Ac_CalcDetails和Ac_CalcDetail由sqlmetal生成(很聰明,它知道如何從行類的表名中刪除「s」)。將進入調試器,讓你確切地知道 – Buswell 2013-03-07 14:10:58

+0

Ac_CalcDetails是一個使用泛型的表,並且類型爲System.Data.Linq.Table 這些都是由使用sqlmetal的腳本自動創建的。所以在另一個開發人員的機器上,它會產生這個錯誤,但它可以通過以下方式修復: a)給我一個我的數據庫的備份,然後他恢復,並且使用這個數據庫來代替 b)讓他在他的本地數據庫上運行sqlmetal。但是當他檢查新代碼時,我得到了與我相同的錯誤 – Buswell 2013-03-07 14:15:59

回答

0

變化

Ac_CalcDetail XY

VAR XY

不是試圖調試它。但顯然看起來你有一些類型錯誤。

+0

歡呼Yahya,我想你是在那裏的東西。說實話,我不知道爲什麼我一直沒有使用匿名類型。現在我將使用導致它崩潰的相同數據庫再次遍歷我的代碼,但使用「var」代替ac_calcDetails之類的任何類,並查看會發生什麼。會後回歡呼 – Buswell 2013-03-08 11:59:23

+0

我這段代碼運行時,得到完全相同的例外 'VAR XYZ =從db.Ac_CalcDetails CD,其中cd.CalcIdent.Equals(CalcIdent) 選擇CD; VAR XY = xyz.First();'當我檢查'xyz.First();'它是一個{e2Linq.Ac_CalcDetail}類型的類時,它看起來應該對我有效 – Buswell 2013-03-08 12:15:28

+0

如果它發生在'.First()' 在調試器中調用'xyz.First();'給出一個 ''xyz.First()'拋出了一個類型'System.InvalidCastException'的異常e2Linq.Ac_CalcDetail {System.InvalidCastException}' – Buswell 2013-03-08 12:25:11

相關問題