空引用异常设置实体框架属性

时间:2017-10-16 17:02:16

标签: c# asp.net entity-framework

我们在为实体框架域对象属性分配不可为空的标量变量时获得了不一致的空引用异常。我理解空引用异常是什么,但是我无法理解在为非空EF域对象的属性分配非空值时如何获取它。

域对象如下所示:

[DataContract]
[Table("Participant", Schema = "tour")]
public partial class Participant
{
    public Participant()
    {
    }
    [DataMember]
    [Key]
    public int ParticipantID { get; set; }
    ...
    public DateTime? AutopayLastAttemptedUtc { get; set; }
}

我们获得例外的区域是:

DateTime utcNow = DateTime.UtcNow;
// The below line throws the Null Reference Exception.
participant.AutopayLastAttemptedUtc = utcNow;
ParticipantService.Update(participant);

如果我添加一些调试代码来证明变量不为null,我仍会在同一行上获得异常:

DateTime utcNow = DateTime.UtcNow;
// This line proves that participant is not null and that
// AutopayLastUpdatedUtc can be read (not that that really
// matters because we only want to set it
TelemetryClient.TrackTrace("Participant", SeverityLevel.Information, new Dictionary<string, string> {
    { "ParticipantId", participant.ParticipantID.ToString() },
    { "AutopayLastUpdatedUtc", participant.AutopayLastAttemptedUtc.ToString() }
});
// The below line throws the Null Reference Exception.
participant.AutopayLastAttemptedUtc = utcNow;
ParticipantService.Update(participant);

我不明白什么可能是null

  • 参与者不能为空,因为我们在上面一行的调试代码中使用它
  • utcNow不能为null,因为它是一个不可为空的类型
  • AutopayLastUpdatedUtc是标准的EF setter

请注意,我不是在询问空引用异常是什么。我问的是在为非null对象的属性赋值非空值时可能会发生空引用异常。

1 个答案:

答案 0 :(得分:0)

尽管已经检查了几种不同的方法,但@MartinLiversage是正确的,报告的行号已经关闭。异常实际上是由后面的行抛出的(示例代码中没有显示),并且一旦找到问题所在行就很容易修复。

我的测试用例是在我们的测试服务器而不是我的开发机器上。这是相当正常的,因为数据库是不同的,并且找到一个在我的开发数据库上触发相同问题的数据库记录并不总是那么容易。它确实使调试变得更难。测试服务器使用“定义DEBUG常量”设置构建,但它也设置了“优化代码”,所以我想知道这是否是导致错误报告行的原因。