【问题标题】:LINQ InvalidCastException errorLINQ InvalidCastException 错误
【发布时间】:2011-01-06 14:30:14
【问题描述】:

我的函数中出现“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 对象,所以一切都应该没问题:/

感谢您的帮助!

【问题讨论】:

  • 进一步回答我的问题,如果您无法找到错误,那么我建议发布数据库中 User 表和应用程序中 User 类/实体的完整定义.
  • 我再次检查了映射,并将数据库表中 UserKey 列的定义从 nvarchar(100) 更改为 uniqueidentifier,正如 Ahmad Mageed 在上一个答案中所建议的那样。它现在可以正常工作。谢谢你们的帮助!

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


【解决方案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

【讨论】:

  • 这就是我的问题的解决方案!当设置“uniqueidentifier”而不是“nvarchar(100)”时,一切正常。非常感谢艾哈迈德!
【解决方案2】:

快速简便的方法告诉你找出答案;将鼠标悬停在字段上并确保它是一个向导。为了安全起见,您可能需要考虑使用 Guid.TryParse 来安全地传递值(如果它是 GUID),以防止发生该错误。在底层数据库中,确实使用了字符串值,不知道有没有内置的转换,还是需要使用Guid.Parse或者Guid.TryParse进行转换。

HTH。

【讨论】:

    【解决方案3】:

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

    检查堆栈跟踪以了解目标类型是什么,这将有助于您缩小要查看的属性的范围。很可能是数据库架构发生了变化,而 Linq 实体没有更新。

    编辑 - 将 ProviderUserKey 转换为 Guid 时也可能发生错误 - 你说这是一个 Guid 装箱为 object 但情况可能并非如此(它可能是 null,例如)。您是否尝试过使用调试器介入并查看实际的运行时类型是什么?

    【讨论】:

    • 我将其映射如下: [Column] public Guid UserKey { get;放;它是数据库中的 nvarchar(100) - 正确吗!?
    • 看起来我第一次没有正确阅读评论。答案是nvarchar(len) 映射到System.String,而这不能被转换为System.Guid
    【解决方案4】:

    我可能不在此处,但您正在创建 MembershipUser 并且您正在通过您的方法返回用户。

    这是设计使然,因为如果两者不匹配,那么您将收到强制转换错误。

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

    【讨论】:

    • 是的,我正在创建用户,该用户会自动保存在 Membership 的 CreateUser 函数中。晚于我希望为某些自定义属性分配值 - 这就是我尝试通过 guid 获取它的原因。我知道这可能应该通过使用配置文件来完成,但没有时间,这不是我项目的重点。
    • 可能不是问题,因为他传入了 MembershipUser 对象的 ProviderUserKey 属性。这就是不匹配的地方。
    • 那么,我可以使用 ProviderUserKey 作为 Guid 对象吗!?如果现在应该将什么传递给 CreateUser 而不是 !?
    • @Kotu,什么是运行时类型? 不要问我们,在调试器中单步执行程序并确定。
    猜你喜欢
    • 2012-02-06
    • 2011-05-24
    • 1970-01-01
    • 2013-03-02
    • 2016-02-24
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多