C# 空引用异常设置实体框架属性
将不可为null的标量变量分配给实体框架域对象属性时,我们得到了一个不一致的null引用异常。我理解空引用异常是什么,但我不理解在将非空值赋给非空EF域对象的属性时如何得到一个空引用异常 域对象如下所示:C# 空引用异常设置实体框架属性,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,将不可为null的标量变量分配给实体框架域对象属性时,我们得到了一个不一致的null引用异常。我理解空引用异常是什么,但我不理解在将非空值赋给非空EF域对象的属性时如何得到一个空引用异常 域对象如下所示: [DataContract] [Table("Participant", Schema = "tour")] public partial class Participant { public Participant() { } [DataMember]
[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);
如果我添加一些调试代码来证明变量不是空的,我仍然会在同一行中得到一个异常:
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);
DateTime utcNow=DateTime.utcNow;
//这一行证明参与者不是空的,并且
//AutopayLastUpdatedUtc可以读取(实际上不是这样
//重要的是我们只想设定它
TelemetryClient.TrackTrace(“参与者”,服务器级别信息,新字典{
{“ParticipantId”,ParticipantId.ToString(),
{“AutopayLastUpdatedUtc”,participant.AutoPayLastAttemptDutc.ToString()}
});
//下一行抛出空引用异常。
participant.autopaylastatemptedutc=utcNow;
参与者服务。更新(参与者);
我不明白什么可能是空的
- 参与者不能为null,因为我们在上面一行的调试代码中使用它
- utcNow不能为null,因为它是不可为null的类型
- AutopayLastUpdatedUtc是标准的EF设置程序
请注意,我不是问什么是空引用异常。我是问在为非空对象的属性分配非空值时,如何可能发生空引用异常。尽管已经用几种不同的方法进行了检查,@MartinLiversage正确地指出报告的行号已关闭。异常实际上是由后面的一行抛出的(示例代码中没有显示),一旦我发现有问题的那行,就很容易修复
我的测试用例是在我们的测试服务器上而不是在我的开发机器上复制的。这很正常,因为数据库是不同的,在我的开发数据库上找到触发相同问题的数据库记录并不总是那么容易。但这确实使调试更加困难。测试服务器使用“Define DEBUG constant”集合,但它也有“Optimize code”集合,所以我想知道这是否是导致错误报告行的原因。AutoPaylastUpdateDTC可以为null,如果正好为null,.ToString()将引发异常。此外,您需要检查参与者的实例是否不为null。如果您在发布版本中看到异常,则报告的行号可能是错误的。例如,引发异常的特定语句可能不是您认为的。这里只有一个可为null的变量……这不是火箭科学。我打赌如果您检查,发生这种情况时AutopayLastAttemptedUtc为null。@Sparrow这不是引发异常的行,我将其作为调试包含进来,以表明参与者和AutopayLastUpdatedUtc都不是null。AutopayLastUpdatedUtc是否为null并不重要,因为引发异常的是setter行。@Martin Liversage很好,但我相信行号是正确的,因为这是一个调试版本,我一直在添加/删除调试代码,但错误行是一致的是的,这正是问题的原因..以及为什么在使用release build.release时会被多次询问(即使设置了调试预处理器)已优化,并扭曲调试信息。@ErikFunkenbusch我只看到一条评论,表明这就是问题所在,这就是我在回答中提到的问题。即使是这条评论,也只是使用了术语“发布版本”,我理解为未定义调试常量(发布与调试相反)。我有一个名为“Release”的配置,但它不是正在使用的配置。如果是“优化代码”选项导致行号问题,那么理想的答案应该提到该选项,而不是“Release”,它可以有多个定义。