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; }
}