2010-01-19 57 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。

相关问题