FirstOrDefault抛出NullReferenceException

时间:2014-09-03 05:39:40

标签: 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()的行会抛出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; }
}

请注意,CntWgt并非旨在保留。它们是瞬态属性。键太大,因为它对应于现有索引视图中的列。两个属性都使用相同的键顺序9进行注释,因为它们是相同的(ID和ID引用的对象)。

1 个答案:

答案 0 :(得分:1)

另一方面,Any与投影和FirstOrDefault之间的差异在于,在后一种情况下,AggregateListAnswer对象具体化。 Any只返回一个布尔值,而投影则是其他一些对象。因此,必须通过创建对象来引起NRE。故障排除的第一步可能是检查查询是否执行(我认为确实如此)。这意味着这样的模型是正确的,不涉及映射问题。

在引用属性上使用KeyAttribute并不常见(并且不是必需的),但它也不会导致任何问题。我假设您取消了两个瞬态属性的映射。

  

如何解决NullReferenceException?

显然,首先要看的是堆栈跟踪。我在检查EF的源代码方面取得了有限的成功。有时它给出了线索​​。

最好是在调试模式下编译EF的源代码,并用编译的代码替换项目中的当前引用。我做过一次,它让我走上正轨。 (通常是我做错了什么)。