运行ASP.NET Core 2.1 ContactManager示例程序时遇ArgumentNullException错误
我在处理ASP.NET Core 2.1的ContactManager示例时也遇到过一模一样的问题,核心原因就是种子初始化流程里,调用userManager.FindByIdAsync(uid)查找用户时返回了null,进而触发ArgumentNullException,最终被包装成AggregateException抛出。你的异常信息也明确指向了这一点:
System.AggregateException HResult=0x80131500 Message=One or more errors occurred. Source=ContactManager StackTrace: at ContactManager.Program.Main(String[] args) in C:\Users\EphraimF\source\repos\CMfinal\Program.cs:line 41 Inner Exception 1: ArgumentNullException: Value cannot be null. The error in generated because a null is returned by `userManager.FindByIdAsync(uid)`.
下面是几个经过验证的解决方案和排查步骤:
调整代码执行顺序,先创建用户再查找:检查你的种子初始化代码,必须先完成用户的创建和持久化操作,再执行
FindByIdAsync查询。很多时候是代码顺序搞反了,先去查找还没创建的用户,自然返回null。验证用户创建是否成功:用户创建可能因为密码复杂度不达标、用户名重复等原因失败,导致数据没有写入数据库。调用
userManager.CreateAsync后一定要检查返回结果:var createResult = await _userManager.CreateAsync(testUser, "YourStrongPassword123!"); if (!createResult.Succeeded) { foreach (var error in createResult.Errors) { Console.WriteLine($"用户创建失败:{error.Description}"); } // 终止后续操作或处理错误 return; }强制保存DbContext更改:创建用户后,别忘了调用
await _context.SaveChangesAsync(),确保用户数据被写入数据库。如果跳过这一步,实际数据库中不会存在该用户记录,FindByIdAsync自然查不到。核对用户ID的准确性:确认传入
FindByIdAsync的uid和你创建用户时的ID完全一致。比如你创建用户时用了testUser.Id = Guid.NewGuid().ToString();,那后续查找必须使用这个生成的ID,而不是硬编码的错误值。
调试小技巧:在调用FindByIdAsync前,打印出uid的值,然后直接查看数据库的AspNetUsers表,确认是否存在该ID的用户。这能快速定位是ID错误,还是用户根本没被创建。
内容的提问来源于stack exchange,提问作者ephraimf

