.NET 6 EF Identity注册时创建自定义对象遇空值问题求助
问题分析与解决方案
核心问题点
- 部门存在性判断逻辑错误:
_context.Departments.Where(o => o.DepartmentName == Input.Department) == null永远不会成立,因为Where返回的是IQueryable<T>对象,绝不会为null,应该通过FirstOrDefault()或Any()判断部门是否存在。 - 未复用创建的部门对象:新增部门后直接查询数据库获取该部门,但此时未执行
SaveChanges(),上下文未将新部门提交到数据库,导致查询结果为null,触发空值异常。 - 导航属性未初始化:
Department类中的Users集合未初始化,可能引发后续操作的空引用问题。
修正后的代码
var user = CreateUser(); await _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); await _emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); if (!string.IsNullOrEmpty(Input.Department)) { // 查询是否存在目标部门 var department = await _context.Departments .FirstOrDefaultAsync(o => o.DepartmentName == Input.Department); // 不存在则创建新部门 if (department == null) { department = new Department() { DepartmentId = Guid.NewGuid().ToString(), DepartmentName = Input.Department, Users = new List<AppUser>() // 初始化集合导航属性 }; await _context.Departments.AddAsync(department); } // 创建Person并关联部门 var person = new Person() { PersonId = Guid.NewGuid().ToString(), Name = Input.Name, Department = department // 直接复用已有/新建的部门对象 }; await _context.Persons.AddAsync(person); // 关联用户与部门 user.Department = department; } // 统一提交所有数据变更 await _context.SaveChangesAsync();
实体类优化建议
在Department类的构造函数中初始化集合导航属性,从根源避免空引用:
public class Department { [Key] public string DepartmentId { get; set; } public string DepartmentName { get; set; } public List<AppUser> Users { get; set; } public Department() { Users = new List<AppUser>(); } }
关键说明
- 复用部门对象:无论是查询到的还是新建的部门,直接用该对象关联
Person和AppUser,无需重复查询数据库,避免空值和冗余操作。 - 统一提交变更:所有实体添加完成后一次性执行
SaveChangesAsync(),保证数据一致性,同时解决未提交导致的查询不到数据问题。 - 初始化导航属性:集合类型导航属性提前初始化,防止后续操作中因集合为null引发的异常。
内容的提问来源于stack exchange,提问作者Trung Đặng Đức
相关产品推荐
相关产品推荐

