LINQ InvalidCastException错误

时间:2010-01-19 00:13:55

标签: c# .net asp.net-mvc linq exception

我的函数中出现“InvalidCastException”(发生在System.Data.Linq.dll中):

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对象,所以一切都应该没问题:/

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

由于您之前在评论中提到它是nvarchar(100),请尝试以下操作:

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

此外,SQL Server有一个uniqueidentifier data type来表示you may consider using的GUID。

答案 1 :(得分:0)

无效的强制转换异常几乎总是由于目标类中的映射不正确(User此处)。

检查堆栈跟踪以查看目标类型是什么,这可以帮助您缩小要查看的属性范围。很可能在数据库模式中发生了一些变化,Linq实体没有更新。

修改 - 将ProviderUserKey投射到Guid时也可能发生错误 - 你说这是一个Guid装箱object但可能不是这样的(例如,它可能是null)。您是否尝试过使用调试器并查看实际的运行时类型是什么?

答案 2 :(得分:0)

我可能不在这里,但你正在创建一个MembershipUser,并且从你的方法中你将返回用户。

这是否设计,因为如果两者不匹配则会出现施法错误。

尝试返回MembershipUser,看看是否有帮助。

答案 3 :(得分:0)

快速简便的方法来说明问题;将鼠标放在场上并确保它是一个guid。为了安全起见,您可能需要考虑使用Guid.TryParse来安全地传递值(如果它是GUID),以防止发生该错误。在底层数据库中,它确实使用了一个字符串值,我不知道是否有任何内置转换,或者你是否需要使用Guid.Parse或Guid.TryParse进行转换。

HTH。