2014-09-03 35 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

相關問題