【问题标题】:LINQ query returns error "The expected type was 'System.Int32' but the actual value was null."LINQ 查询返回错误“预期类型为 'System.Int32',但实际值为 null。”
【发布时间】:2022-04-19 18:57:30
【问题描述】:

所以这是查询:

from c in Contents
join cs in DepartmentSharings 
on c.ContentId equals cs.ContentId
select c.PrivateCategoryId.Value

当我运行它时,我得到:

处理请求时数据库操作失败。 InvalidOperationException:读取一个异常时发生 属性“DepartmentSharing.ContentId”的数据库值。这 预期类型为“System.Int32”,但实际值为 null。

现在我检查了数据库中的DepartmentSharings.ContentId 字段,即fk, int, not null。在课堂上是public int ContentId { get; set; }DepartmentSharing.ContentId 不能是 null。此外,在 LinqPad 中,我可以看到它在失败之前返回 58 行。 为什么会出现此错误?

【问题讨论】:

  • 我对那个错误消息持怀疑态度,因为为此生成的 SQL 将 没有理由 获取该值 - 这只是 join 的一部分- 类似select c.PrivateCategoryId from Contents c inner join DepartmentSharings cs on c.ContentId = cs.ContentId。你确定真正的问题不是PrivateCategoryIdnull
  • 如果您可以看到它在失败前返回 58 行,您可能需要查看第 59 行中的数据,看看它的样子以及它是否看起来很有趣......
  • 你能否捕获使用分析器触发的 sql 查询并直接在 ssms 中运行以快速检查结果
  • 我想是这个:select c.PrivateCategoryId.Valuec.PrivateCategoryId 可能为空。
  • @MarcGravell 那是 EF Core,如果它不能翻译它可以在内存中执行查询(而且它不能经常),所以也许真正的 OP 查询有点复杂,或者,怎么知道,也许由于某种原因,EF Core 甚至无法翻译这个(例如,我们不知道 ContentsDepartmentSharings 是什么)。

标签: c# linq asp.net-core-2.0


【解决方案1】:

唯一会导致该错误的是ContentId 是一个不可为空的 int 属性,但不知何故,您的数据库表允许该列的 NULL 值。假设 EF 正在处理您的数据库,这不应该发生,但您可能在某些时候更改了某些内容并且没有正确迁移。

无论如何,您需要将属性类型更改为 int? 而不是 int 或更改表以使列 NOT NULL 并确保所有行都具有非 NULL 值。

【讨论】:

  • 这在 EntityFrameworkCore 上对我有用,使用 'context.object.FromSql("Exec dbo.MyProcedure")' 进行过程数据库调用不,你总是会得到这个错误。正如@Chris 所说,只需更改以下内容即可解决您的问题。公共 int 值 { 获取;放; } 到公共 int?价值{得到;放; }
【解决方案2】:

Chris 的回答看起来明智且正确,但我有另一种经历。

我有两张表,它们是相关的。有问题的字段是匹配(不是键,而是像键)字段。属性设置为不可为空,并且相关的数据库字段也相同。出现问题是因为第二个表中的第一个表没有任何相关数据。因此,比较两个字段会导致问题。实际上这种情况不是预期的,但测试数据已损坏。即便如此,我在现有条件之前添加了另一个条件“如果数据存在”并且问题消失了。

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2021-11-20
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2015-08-02
    相关资源
    最近更新 更多