2012-01-03 48 views
2

我有數據庫與Linq-To-Sql類映射。我試着對它執行一些基本的查詢,當我嘗試訪問子表時,它會失敗並返回InvalidCastException。Linq-to-SQL檢索子表拋出InvalidCastException

var query = (from p in PBZGdb.Instance.AuthenticationDatas 
        where p.Username == "Misha" && p.Password == "123" 
        select new { p.UserAccount }).AsEnumerable(); 

UserAccount UA = query.ElementAt(0).UserAccount; //this works! 
int count = UA.Characters.Count(); //throws InvalidCastException here 

var query = (from p in PBZGdb.Instance.AuthenticationDatas 
        where p.Username == "Misha" && p.Password == "123" 
        select new 
        { 
         p.UserAccount, 
         p.UserAccount.Characters 
        }) .AsEnumerable(); 

UserAccount UA = query.ElementAt(0).UserAccount; //throws InvalidCastException here 

如果我只是試圖繼續異常後,幾秒鐘後,暫停該應用程序,它「檢索」中的數據,並進行沒有問題。有沒有人遇到過這樣的事情?我如何解決它?

p.s.字符表通過外鍵鏈接到UserAccounts。一個UserAccount可以有多個字符。

+0

你使用什麼提供者?你在輸出中看到* real * SQL查詢嗎? – Tigran 2012-01-03 10:19:20

+1

我不確定我們在這裏有足夠的信息;你可以訪問一個單獨的'Character'記錄,即'var char = db.Characters.First()'?我不知道這是不是一個簡單的列錯誤配置(長vs int,或者是一個狡猾的枚舉值等) – 2012-01-03 10:24:59

+1

不相關:'p.Password'設置的鬧鐘聲音....應該是一個鹽味散列,真的 – 2012-01-03 10:25:30

回答

0

好吧,我想我想通了!它真的很奇怪,我不知道爲什麼/發生了什麼,但我確定了我的錯誤,現在可以修復它。

我用sqlmetal生成了我的映射.dbml文件。接下來,當我將它添加到項目中時,我重命名了它。但我認爲我將其重新命名爲不一致(在設計器中它顯示爲myMeta,在cs文件中它被命名爲myDB,並且我在其他地方使用myDB名稱)。而當所有問題都開始發生時。只要我將它改回原來的名字,一切都沒有問題!

0

當您嘗試此操作時會發生什麼?

var query = (from p in PBZGdb.Instance.AuthenticationDatas 
       where p.Username == "Misha" && p.Password == "123" 
       select new { p.UserAccount }).AsEnumerable(); 

UserAccount UA = query.ElementAt(0).UserAccount; //this works! 
var count = UA.Characters.Count(); //throws InvalidCastException here 

(注變種不是int)

+0

同樣的例外。更有趣的是,當我將鼠標放在UA.Characters(或添加監視表達式)上時,它會給出InvalidCastException,但是如果在VS中按下Resume幾次,它將檢索正確的值(它是2)並且正常進行。 – 2012-01-03 10:33:50

+0

<稻草離合器>數據上下文/型號是最新的嗎?也許從數據庫中回來的東西並不完全相加......嘗試重新從DB重新拖動所有東西? plenderj 2012-01-03 18:10:12

0

檢查你列的數據類型。嘗試將列中的值分配給屬性值時,多次出現此錯誤。

嘗試保持以下映射一致。

 
SQL   .NET 

bit  -> bool 
tinyint -> byte 
smallint -> short 
int  -> int 
bigint -> long 
decimal -> decimal 
money  -> decimal 
float  -> double (preferred) | float 

還有其他不一致的映射會拋出同樣的錯誤,但根據我的經驗,這些是最常見的情況。

問題是,當LINQ-SQL填充你的屬性值時,它只是分配值而不轉換它,你會得到同樣的錯誤,就好像你試圖給int屬性賦值short值一樣。

還檢查可能的空值。這些屬性應該在你的類中可以爲空。 Nullable<int> | int?

相關問題