NullReferenceException

NullReferenceException

给定代码:

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所引用的对象)。

最佳答案

一方面Any和投影之间的差异,另一方面是FirstOrDefault的区别是,在后一种情况下,实现了AggregateListAnswer对象。 Any仅返回布尔值和投影其他对象。因此,NRE必须由创建对象引起。故障排除的第一步可能是检查查询是否完全执行(我认为确实可以执行)。这将意味着该模型本身是正确的,并且不涉及任何映射问题。

在引用属性上使用KeyAttribute是不常见的(也是不必要的),但也不应引起任何问题。我假设您未映射这两个瞬态属性。


如何解决NullReferenceException?


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

更好的方法是在调试模式下编译EF的源代码,并用已编译的源代码替换项目中的当前引用。我曾经做过一次,这使我走上了正确的道路。 (通常是我做错了)。

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

10-11 05:23