2014-09-03 112 views
3

给予代码:FirstOrDefault引发的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的问题?

UPDATE

我可以解决此问题使用上具有相同属性的实体的投影,但没有[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的对象)。

+0

最终在您的项目中使用[EF源代码](https://entityframework.codeplex.com/),但可能会有更短的路径。在课堂实例中引发的任何关于该类或初始化程序或代码的内容? – tschmit007 2014-09-03 08:14:10

+0

@ tschmit007:不,它只是一堆属性。有一个用'KeyAttribute'定义的多属性键,对应于索引视图中的多列键。 – 2014-09-03 16:30:09

+0

@ tschmit007:不幸的是,EF团队无法发布调试符号,尽管存在相当复杂的解决方法https://entityframework.codeplex.com/workitem/386。 – 2014-09-03 17:09:20

回答

1

另一方面,Any和投影之间的区别和FirstOrDefault另一方面是在后者的情况下AggregateListAnswer对象物化。 Any只返回一个布尔值并投影一些其他对象。所以NRE必须由创建对象引起。排除故障的第一步可能是检查查询是否执行(我认为它是)。这意味着模型本身是正确的,并且不涉及映射问题。

在引用属性上有一个KeyAttribute并不常见(也不是必需的),但它们都不应引起任何问题。而且我假定你没有映射两个瞬态属性。

如何诊断NullReferenceException?

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

更好的方法是在调试模式下编译EF的源代码,并用编译好的项目替换项目中的当前引用。我曾经这样做过,这让我走上了正轨。 (通常这是我做错了什么)。

+0

你如何在不建立自己的情况下检查源代码?最后我检查了一下,由于NuGet系统超时,EF团队无法发布调试符号。 – 2014-10-13 21:27:40

+0

只需在[github](https://github.com/aspnet/EntityFramework)上提供的源代码即可。 – 2014-10-13 21:29:35

相关问题