【问题标题】:FirstOrDefault throws NullReferenceExceptionFirstOrDefault 抛出 NullReferenceException
【发布时间】:2014-09-03 05:39:40
【问题描述】:

给定代码:

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

【问题讨论】:

  • 最终在您的项目中使用EF source code,但路径可能更短。关于类或初始化程序或类实例化时触发的代码的任何信息?
  • @tschmit007:不,这只是一堆属性。有一个用KeyAttribute定义的多属性键,对应索引视图中的多列键。
  • @tschmit007:不幸的是,EF 团队无法发布调试符号,尽管有一个相当复杂的解决方法entityframework.codeplex.com/workitem/386
  • 如果您重建 dll,则不需要调试符号。卸载包,从代码库添加新项目设置依赖项并运行....
  • @EricJ。你能显示AggregateListAnswer 类代码吗?

标签: entity-framework entity-framework-6


【解决方案1】:

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

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

如何解决 NullReferenceException?

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

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

【讨论】:

  • 如何在不构建自己的情况下检查源代码?最后我检查了一下,由于 NuGet 系统超时,EF 团队无法发布调试符号。
  • 只是github 提供的源代码。
猜你喜欢
  • 2013-05-30
  • 1970-01-01
  • 2020-11-17
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多