EF查询实体为null赋值报空引用 无需if内重初始化的解决方法
问题根因
你遇到空引用的核心原因是开头的初始化写法完全无效:
// 这行new出来的实例会在下一行被直接覆盖,没有任何实际作用 ApplicantsRegistration applicantsRegistration = new ApplicantsRegistration(); applicantsRegistration = _context.ApplicantsRegistrations.FirstOrDefault();
FirstOrDefault()在表中没有匹配数据时会直接返回null,这行赋值会直接把变量指向null,你之前new出来的对象因为没有任何变量引用,会被垃圾回收器回收。此时你直接访问null的属性,自然会抛出空引用异常。
解决方案
不存在“不创建实例就给实例属性赋值”的可能——要给属性赋值首先得有真实存在的对象实例,但你完全不需要在if块里写冗余的初始化逻辑,用C# 8.0及以上版本支持的null合并赋值运算符??=,可以把逻辑写得非常简洁,连单独的if判断块都可以省掉:
// 不需要提前new对象,直接接收查询结果 ApplicantsRegistration applicantsRegistration = _context.ApplicantsRegistrations.FirstOrDefault(); // 变量为null时自动new一个实例赋值,非null就保持原有查询结果 applicantsRegistration ??= new ApplicantsRegistration(); // 执行到这里时变量绝不可能为null,可以安全绑定表单数据 applicantsRegistration.Name = formPost.Name; applicantsRegistration.Email = formPost.Email; // 其余属性按同样逻辑赋值即可
如果这个新创建的实例后续需要新增到数据库,只要在所有属性赋值完成后,调用_context.ApplicantsRegistrations.Add(applicantsRegistration)再执行SaveChanges()即可,EF Core会自动识别实体状态,不会把查询出来的已有数据误判为新增。
顺带提一句,你原来把属性赋值全写在if (applicantsRegistration == null)块里的逻辑本身也有问题:如果数据库查到了已有注册记录,表单提交的新值就不会绑定到实体上,后续的更新操作根本不会生效,把通用的属性赋值逻辑移到null判断外面才是正确的写法。
内容的提问来源于stack exchange,提问作者Hasnatul Karim
相关产品推荐
相关产品推荐

