Entity Framework Core的Linq查询返回InvalidCastException。

5
我目前在使用Entity Framework创建一个.NET CORE的Web API。每次我尝试使用LINQ通过ID选择单个记录时,都会遇到以下错误:

System.InvalidCastException异常发生于Microsoft.EntityFrameworkCore.dll但未在用户代码中处理。

其他信息:无法将类型为“System.Int32”的对象强制转换为类型“System.Char”。

只要执行以下LINQ查询,就会出现此错误:

int id = 1;
User user = context.Users.First(i => i.UserId == id);

我已经检查过了,字段UserId和变量id都是整数。此外,表中包含足够的元素,并且具有id为1的行。

有人能告诉我我在这里做错了什么吗?

编辑:这是User模型的一部分:

public class User
{
    public int UserId { get; set; }
    (...)
}

1
我认为这个问题中还没有足够的信息来回答。至少需要提供表的定义和类的定义才能解决这个问题。 - user743382
1
尝试使用 i.UserId.Equals(id) 替代 i.UserId == id。 - agua from mars
1
这是类定义的一部分。完整的类定义和表定义是什么?这可能很容易发生,因为其他列不匹配。 - user743382
1
可能是因为您在数据库中定义了一个整数,但在属性中将其定义为“char”。 - Rob
1
@Rob 谢谢!这就是问题所在。我的数据模型中有一个char属性,但在数据库中为整数。 - Max
显示剩余3条评论
1个回答

6

注意:答案实际上是在原问题下的评论中提供的。我在此处添加了一些内容,以使其更加明显和清晰。


通过表示每个表中各列的属性,Entity Framework 很明显将 C# 类映射到数据库表。现在,如果这些属性之一的数据类型与数据库中相应列的数据类型不兼容,则即使不直接涉及不匹配的属性,在尝试从该表获取任何内容时,您也会收到 System.InvalidCastException

在问题中,查询为:

User user = context.Users.First(i => i.UserId == id);

即使 id 和对应的属性 UserId 都是有效的且相互兼容,这并不重要,因为正在获取整个类 User 的实例。

显然,User 中某些其他属性的类型与数据库中 user 表中具有相同名称的列的类型不兼容,因此尝试将其映射到该属性时会引发上述异常。


8
你知道是否有一种实际的方法可以识别该列吗? - Pedro Costa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接