我的函数中出现“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对象,所以一切都应该没问题:/
感谢您的帮助!
答案 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。