2010-01-19 55 views
3

我得到我的功能 「InvalidCastException的」(發生在System.Data.Linq.dll):LINQ InvalidCastException的

public User GetUserByKey(Guid key) 
{ 
      return usersTable.FirstOrDefault(m => m.UserKey == key); 
} 

這是這裏所說的:

MembershipUser mu = Membership.CreateUser(user.UserName, user.Password, user.Email, null, null, true, Guid.NewGuid(), out status); 
User new_user = _UsersRepository.GetUserByKey((Guid)mu.ProviderUserKey); 

mu.ProviderUserKey Guid對象封裝在一般對象類型中,所以一切都應該很好:/

感謝您的幫助!

+0

除了我的回答,如果您無法找到錯誤,那麼我建議在您的應用程序中發佈數據庫中的User用戶表和用戶類/實體的完整定義。 – Aaronaught 2010-01-19 00:33:37

+0

我再次檢查映射,並將數據庫表中的UserKey列的定義從nvarchar(100)更改爲uniqueidentifier,如Ahmad Mageed在上一個答案中所建議的那樣。它現在可以正常工作。謝謝你們的幫助! – Kotu 2010-01-19 14:25:03

回答

1

既然你提到它在您的留言nvarchar(100)較早嘗試這個辦法:

Guid key = new Guid(mu.ProviderUserKey.ToString()); // object to string 
User new_user = _UsersRepository.GetUserByKey(key); 

此外,SQL Server有一個uniqueidentifier data type來表示的GUID you may consider using

+0

這是我的問題的解決方案!當設置「uniqueidentifier」而不是「nvarchar(100)」時,所有內容都可以正常工作。非常感謝艾哈邁德! – Kotu 2010-01-19 14:18:44

0

無效的轉換異常幾乎總是由於目標類中的映射不正確(User此處)。

檢查堆棧跟蹤以查看目標類型是什麼,這應該有助於縮小要查看的屬性。數據庫模式中很可能發生了一些變化,並且Linq實體未更新。

編輯 - 錯誤也可能是鑄造ProviderUserKeyGuid時發生的一切 - 你說這是盒裝作爲一個objectGuid可能並非如此(這可能是null,例如)。你有沒有嘗試加入調試器,看看實際的運行時類型是什麼?

+0

我將它映射如下: [Column] public Guid UserKey {get;組; }它是數據庫中的nvarchar(100) - 它是正確的嗎? – Kotu 2010-01-19 00:28:14

+0

看起來我第一次沒有正確閱讀評論。答案是** no **,'nvarchar(len)'映射到'System.String',**不能**被轉換爲'System.Guid'! – Aaronaught 2010-01-19 02:30:59

0

我可能不在這裏,但你正在創建一個MembershipUser,並從你的方法返回用戶。

這是由設計,因爲如果兩者不匹配,那麼你會得到一個轉換錯誤。

嘗試返回一個MembershipUser,看看是否有幫助。

+0

是的,我創建的用戶會自動保存在Membership的CreateUser函數中。晚於我希望爲某些自定義屬性賦值 - 這就是爲什麼我試圖通過guid獲取它。我知道這應該通過使用配置文件來完成,但沒有時間,並且這不是我項目的重點。 – Kotu 2010-01-19 00:37:06

+0

可能不是問題,因爲他傳遞的是MembershipUser對象的'ProviderUserKey'屬性。這是不匹配的地方。 – 2010-01-19 00:38:48

+0

那麼,我可以使用ProviderUserKey作爲Guid對象!如果現在應該傳遞給CreateUser而不是! – Kotu 2010-01-19 00:46:28

0

快速,簡單的方式告訴弄清楚;將鼠標懸停在現場並確保它是一個指導。爲了安全起見,您可能需要考慮使用Guid.TryParse安全地傳遞該值(如果其GUID),以防止發生錯誤。在底層數據庫中,它確實使用了字符串值,我不知道是否有任何內置轉換,或者是否需要使用Guid.Parse或Guid.TryParse進行轉換。

HTH。

相關問題