给定代码:
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。视图中有很多数据。
是什么原因造成的?如何解决
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; }
}
请注意,
Cnt
和Wgt
不能保留。它们是瞬时属性。键之所以太大,是因为它与现有索引视图中的列相对应。两个属性都用相同的键序9注释,因为它们是同一事物(ID和ID所引用的对象)。 最佳答案
一方面Any
和投影之间的差异,另一方面是FirstOrDefault
的区别是,在后一种情况下,实现了AggregateListAnswer
对象。 Any
仅返回布尔值和投影其他对象。因此,NRE必须由创建对象引起。故障排除的第一步可能是检查查询是否完全执行(我认为确实可以执行)。这将意味着该模型本身是正确的,并且不涉及任何映射问题。
在引用属性上使用KeyAttribute
是不常见的(也是不必要的),但也不应引起任何问题。我假设您未映射这两个瞬态属性。
如何解决NullReferenceException?
显然,首先要看的是堆栈跟踪。在检查EF发生异常的源代码方面,我获得的成功有限。有时它提供了一个线索。
更好的方法是在调试模式下编译EF的源代码,并用已编译的源代码替换项目中的当前引用。我曾经做过一次,这使我走上了正确的道路。 (通常是我做错了)。
关于entity-framework - FirstOrDefault引发NullReferenceException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25636961/