Entity framework FirstOrDefault引发NullReferenceException
鉴于代码:Entity framework FirstOrDefault引发NullReferenceException,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,鉴于代码: using (MyContext ctx = new MyContext()) { // Returns true: var any = ctx.AggregateListAnswers.Any(); // Throws NullReferenceException: var fod = ctx.AggregateListAnswers.FirstOrDefault(); } 调用.FirstOrDefault()的行抛出NullReference
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");
这是一个类,方法名被缩短以混淆某些域详细信息:
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的源代码,并将项目中的当前引用替换为已编译的引用。我做过一次,这让我走上了正确的道路。(通常是我做错了什么)。最终通过在项目中使用,但可能会有一条更短的路径。关于类、初始化器或在类实例化时触发的代码的任何信息?@tschmit007:不,它只是一堆属性。有一个用
KeyAttribute
定义的多属性键,对应于索引视图中的多列键。@tschmit007:很遗憾,EF团队无法发布调试符号,尽管有一个相当复杂的解决方法。如果重建dll,您不需要调试符号。取消安装包,从代码存储库添加新项目,设置依赖项并运行…@EricJ。你能展示一下AggregateListAnswer
类代码吗?你如何在不构建自己的情况下检查源代码?上次我检查时,由于NuGet系统中的超时,EF团队无法发布调试符号。只有在上可用的源代码。
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; }
}