2012-01-03 331 views
0

這是有點棘手,弄清楚我想,也許我失去了一些東西。 我是一個新手,試圖將通過Linq-to-SQL映射的數據庫綁定到我的服務器。有一個客戶端調用的函數,從數據庫中檢索UserAccount:Linq to SQL InvalidCastException

public static explicit operator Dictionary<byte, object>(UserAccount a) 
    { 
     Dictionary<byte, object> d = new Dictionary<byte, object>(); 
     d.Add(0, a.AuthenticationDatas.Username); 
     int charCount = a.Characters.Count; 
     for (int i = 0; i < charCount; i++) 
     { 
      d.Add((byte)(i + 1), (Dictionary<byte, object>)a.Characters[i]); 
     } 
     return d; 
    } 

什麼這實際上做的是一個UserAccount類型轉換爲詞典的我的服務器的數據類型。 UserAccount本身從數據庫中檢索,然後通過這個函數轉換。

然而,當我運行這個功能,我得到InvalidCastException的上線:

int charCount = a.Characters.Count;

而且,當VS斷點@這條線,我可以等待幾秒鐘,然後繼續和錯誤時拋出將會消失!它在那之後正確地檢索Characters.Count。

這裏是我的字符映射:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="UserAccount_Character", Storage="_CharactersTBs", ThisKey="UID", OtherKey="UID")] 
    public EntitySet<Character> Characters 
    { 
     get 
     { 
      return this._Characters; 
     } 
     set 
     { 
      this._Characters.Assign(value); 
     } 
    } 

我相信什麼情況是,要求以某種方式在另一個線程,然後與數據庫交互的一個執行,並出現了錯誤的數據庫,然後才能實際檢索漢字表。我不太確定...

有誰知道這個問題可能是什麼,我怎麼能syncronize它(不添加一些瘸子延遲)?

編輯:

好吧,我縮小的問題。它與不同的線程聯網或什麼不相關......它只是我愚蠢。這是一個簡單的數據庫查詢,它引發InvalidCastException @行int count = UA.Characters.Count;

static void Main(string[] args) 
    {   

     IEnumerable<UserAccount> query = from p in PBZGdb.Instance.AuthenticationDatas 
             where p.Username == "Misha" && p.Password == "123" 
             select p.UserAccount; 
     UserAccount UA = query.ElementAt(0); 
     int count = UA.Characters.Count; 
     Console.WriteLine(count); 
     Console.ReadKey(); 
    } 

(附註)UA IS NOT NULL它確實找到userAccount的正確的實例,它有2個字符。如果我等幾秒鐘,然後再試異常消失.. 我在做什麼錯了?這是我第一次真的在VS中使用數據庫,請幫忙! :)

+0

提供例外的確切消息。 – leppie 2012-01-03 06:59:16

+0

奇怪,我懷疑'(byte)(i + 1)'可能會拋出異常。 – 2012-01-03 07:01:19

+0

你確定它在這行'int charCount = a.Characters.Count;'?你有沒有在調試或發佈模式下運行它?由於在發佈模式下發生的優化,調試器有時可能會有點困惑。 – ChrisWue 2012-01-03 07:02:46

回答

1

後約

d.Add((byte)(i + 1), (Dictionary<byte, object>)a.Characters[i]); 

嘿只是想有同樣的問題有誰知道,我想它了。發生了什麼事是我通過sqlmetal生成後,將其添加到我的項目中時手動更名爲 LINQ .dbml文件。當然,我做到了不一致(它在設計器中重命名,但不在其.cs文件中)。我剛剛用sqlmetal重新生成了一個帶有正確名稱的新.dbml文件,而且一切都像黃油一樣工作!

謝謝你們!

1

它看起來像你遇到延遲執行EntitySet的問題。一個簡單的方法來檢查此問題並可能解決此問題將嘗試調用.Count()方法,而不是訪問.Count屬性。

只要您點擊該行,您就可以在調試器中查看並查看a.Characters.IsDeferred的值。


編輯

另一件事你可以嘗試將通過用foreach取代你的循環是通過隱含調用它的.GetEnumerator()(和相關.MoveNext())來強制執行查詢:

int i = 0; 
foreach (var character in a.Characters) 
{ 
    d.Add(/* ... */); 
    ++i; 
} 

雙編輯

刪除評論澄清在評論下方

+0

我也檢查了IsDeferred,它說的是真的。但我不太確定這個屬性的含義? – 2012-01-03 08:11:37

+0

如果'.IsDeferred'爲true,那麼查詢還沒有實際執行(或執行完畢)。另外,你確定你可以從'Character'類型轉換爲輸入'Dictionary '?這就是你的第一個代碼塊的第8行:'d.Add((byte)(i + 1),(Dictionary )a.Characters [i]);'。這是將'd'中的'object'設置爲'Dictionary '爲_another_'Dictionary '。這真的是你想要的嗎? – rejj 2012-01-03 08:17:37

+0

我曾嘗試使用.Count()我收到完全相同的異常「指定的轉換無效」。如果我等待幾秒鐘,然後單擊「恢復」它運行良好...我認爲它不暫停正在請求它的線程.. – 2012-01-03 08:17:51