Entity Framework Core linq 查询返回 InvalidCastException

Posted

技术标签:

【中文标题】Entity Framework Core linq 查询返回 InvalidCastException【英文标题】:Entity Framework Core linq query returns InvalidCastException 【发布时间】:2017-03-19 19:54:27 【问题描述】:

我目前正在使用实体框架在 .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; 
    (...)

【问题讨论】:

我认为问题中没有足够的信息来回答这个问题。至少,表定义和类定义也是需要的。 尝试使用 i.UserId.Equals(id) 而不是 i.UserId == id 这是类定义的一部分。什么是完整的类定义,什么是表定义?由于其他列不匹配,很容易发生这种情况。 这可能是因为您有一个属性定义为char,它是数据库中的一个整数。 @Rob 谢谢!这就是问题所在。在我的数据模型中有一个 char 属性,但在数据库中是整数。 【参考方案1】:

注意:答案实际上是在原始问题下的评论中提供的。我只是在这里添加一点,让它更明显更清晰。


Entity Framework 显然通过代表每个表中的各个列的属性将 C# 类映射到数据库表。现在,如果这些属性之一的数据类型与其在数据库中对应列的数据类型不兼容,那么当您尝试从该表中获取任何内容时,您将得到一个System.InvalidCastException,即使不匹配的属性没有直接涉及查找。

在问题中,查询是:

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

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

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

【讨论】:

您知道是否有能够识别列的实际方法吗?

以上是关于Entity Framework Core linq 查询返回 InvalidCastException的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 快速开始

EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?

张高兴的 Entity Framework Core 即学即用:创建第一个 EF Core 应用

Entity Framework Core 迁移命令

Entity Framework Core - 计算字段排序

Entity Framework Core 性能优化