FirstOrDefault()抛出未设置为对象错误实例的对象引用

本文关键字:错误 对象 实例 对象引用 设置 FirstOrDefault | 更新日期: 2023-09-27 17:57:33

我有以下代码行:

var y = userRep.All.FirstOrDefault(x => x.UserName == userName);

userRep是一个存储库类,All方法被定义为

public IQueryable<User> All
{
    get { return _context.Users; }
}

userName被传递到函数中,使用调试器我可以验证它是否有值。每当我运行那行代码时,我都会收到一个错误:

对象引用未设置为对象错误的实例。

如果我将条件硬编码到x.UserName == "abc",它可以正常工作,但我不确定为什么当调试器显示userName中有值时,它一直认为userName为null。

FirstOrDefault()抛出未设置为对象错误实例的对象引用

您的这行代码是正确的:

var y = userRep.All.FirstOrDefault(x => x.UserName == userName);

如果假设第二个userName为null,即使在这种情况下,它也不会抛出异常,但如果查询返回null意味着找不到记录,那么y将为null,并且当您访问或迭代它时,它将通过异常。

如果您没有实例化userRep,它将抛出异常。

这样做,在查询数据库之前,假设您的dbcontext类名为MyDbContext

var userRep = new MyDbContext();

在没有更多细节的情况下,并且想当然地认为之前提出的任何答案都没有解决您的问题,我可以想到另一个可能的原因:"userName"变量(或其他示例中未显示的外部变量)正在被"捕获",最终,某些东西正在改变其值。例如

var y = userRep.All.FirstOrDefault(x => x.UserName == userName);
...
userName = null;
...
foreach(var x in y){...}

点击此处了解更多信息http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx

我让它工作起来了,它与Glimpse和实体框架有关,我发现了这个链接,其中包含详细信息:https://github.com/Glimpse/Glimpse/issues/766我不得不将实体框架降级到6.0.2,现在它可以工作了。