運行我在生產服務器或其他開發人員計算機上編寫的代碼時,它會在此行上崩潰。使用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數據庫比較工具等)。
雖然這很奇怪,但我知道我們的數據庫並沒有完全相同的年齡(如果有的話),所以不知道爲什麼這個錯誤現在正在發生,爲什麼錯誤信息什麼也沒說!
什麼類型是'Ac_CalcDetails'和什麼類型是'CalcIdent'? – SpaceBison 2013-03-07 14:02:52
在上面的C#代碼行中CalcIdent是一個字符串。在數據庫中它是唯一標識符。我不認爲這是問題,但其他開發人員使用我的數據庫時沒問題。 Ac_CalcDetails和Ac_CalcDetail由sqlmetal生成(很聰明,它知道如何從行類的表名中刪除「s」)。將進入調試器,讓你確切地知道 – Buswell 2013-03-07 14:10:58
Ac_CalcDetails是一個使用泛型的表,並且類型爲System.Data.Linq.Table 這些都是由使用sqlmetal的腳本自動創建的。所以在另一個開發人員的機器上,它會產生這個錯誤,但它可以通過以下方式修復: a)給我一個我的數據庫的備份,然後他恢復,並且使用這個數據庫來代替 b)讓他在他的本地數據庫上運行sqlmetal。但是當他檢查新代碼時,我得到了與我相同的錯誤 –
Buswell
2013-03-07 14:15:59