gpt4 book ai didi

entity-framework - FirstOrDefault 抛出 NullReferenceException

转载 作者:行者123 更新时间:2023-12-04 08:57:39 24 4
gpt4 key购买 nike

给定代码:

using (MyContext ctx = new MyContext())
{
// Returns true:
var any = ctx.AggregateListAnswers.Any();
// Throws NullReferenceException:
var fod = ctx.AggregateListAnswers.FirstOrDefault();
}

调用 .FirstOrDefault() 的行抛出一个 NullReferenceException,而调用 .Any() 的行返回 true

AggregateListAnswer 的映射定义如下:

modelBuilder.Entity<AggregateListAnswer>().ToTable("UccAggregate_ListAnswers");

初始创建后,table is dropped, and an indexed view of the same name被 build 。 View 中有大量数据。

这可能是什么原因造成的?如何解决 NullReferenceException

更新

我可以在具有相同属性但没有 [KeyAttribute] 属性的实体上使用投影来解决这个问题:

var materialized = ctx.Set<AggregateListAnswer>
.Select(a => new AggregateListAnswerNoKey()
{
PropA = a.PropA,
PropB = a.PropB
}).ToList()

这是类,缩短了方法名称以混淆一些域细节:

public class AggregateListAnswer
{
[Key, Column(Order = 0)]public virtual int? PY { get; set; }
[Key, Column(Order = 1)]public virtual short? CC { get; set; }
[Key, Column(Order = 2)]public virtual short? BC { get; set; }
[Key, Column(Order = 3)]public virtual short? MC { get; set; }
[Key, Column(Order = 4)]public virtual short? SC { get; set; }
[Key, Column(Order = 5)]public virtual short? BSC { get; set; }
[Key, Column(Order = 6)]public virtual short? FTC { get; set; }
[Key, Column(Order = 7)]public virtual short? MTC { get; set; }
[Key, Column(Order = 8)]public virtual short? DTC { get; set; }
[Key, Column(Order = 9)]public virtual int RQId { get; set; }
[Key, Column(Order = 9)]public virtual Question RQ { get; set; }
[Key, Column(Order = 10)]public virtual int NumericValue { get; set; }
[Key, Column(Order = 11)]public virtual short? SeC { get; set; }

public long Cnt { get; set; }

public double Wgt { get; set; }
}

请注意,CntWgt 并非旨在持久化。它们是 transient 属性。键是如此之大,因为它对应于现有索引 View 中的列。两个属性都使用相同的键顺序 9 进行注释,因为它们是同一事物(ID 和 ID 所指的对象)。

最佳答案

Any 和一方面的投影与另一方面的 FirstOrDefault 之间的区别在于,在后一种情况下,AggregateListAnswer 对象被物化了。 Any 只返回一个 bool 值和一些其他对象的投影。所以NRE一定是创建对象引起的。故障排除的第一步可能是检查查询是否完全执行(我认为是)。这意味着模型本身是正确的,不涉及映射问题。

在引用属性上使用 KeyAttribute 并不常见(也不是必需的),但也不应引起任何问题。我假设您取消映射了两个 transient 属性。

How can I troubleshoot the NullReferenceException?

显然,首先要看的是堆栈跟踪。我在检查发生异常的 EF 源代码方面取得的成功有限。有时它会提供线索。

更好的方法是在 Debug模式下编译 EF 的源代码,并将项目中的当前引用替换为已编译的引用。我做过一次,它让我走上了正确的轨道。 (通常是我做错了什么)。

关于entity-framework - FirstOrDefault 抛出 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25636961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com