ASP.NET Core Identity UserManager重复获取用户是否复用EF Core上下文?
问题解答
核心结论
在同一Web API请求生命周期内,第二次调用UserManager.FindByIdAsync不会再查询数据库,直接从EF Core上下文的跟踪缓存中返回用户实体。
原因是:ASP.NET Core Identity的EF Core实现(UserStore<TUser>)中,FindByIdAsync底层调用的是EF Core的FindAsync方法——这个方法的逻辑是先检查当前上下文是否已跟踪对应ID的实体,存在则直接返回;不存在才执行数据库查询,且查询到的实体会自动加入上下文跟踪。
简单测试方法(无需复杂数据库分析)
如果你想验证这个行为,用以下两种简单方式即可:
- 方式一:检查实体引用与跟踪状态
在两次调用方法后,验证返回的用户是否为同一对象实例,同时查看上下文的跟踪记录:var user1 = await _userManager.FindByIdAsync(userId); // 检查上下文是否已跟踪该用户 var trackedUser = _dbContext.ChangeTracker.Entries<User>().FirstOrDefault(e => e.Entity.Id == userId); Console.WriteLine(trackedUser != null); // 输出true,说明实体已被跟踪 var user2 = await _userManager.FindByIdAsync(userId); // 验证两个变量是否指向同一个对象 Console.WriteLine(ReferenceEquals(user1, user2)); // 输出true,证明未再次查库 - 方式二:查看EF Core的SQL日志
在appsettings.json中配置EF Core的命令日志级别,运行API后查看控制台/日志文件:
你会发现只有第一次调用时生成了"Logging": { "LogLevel": { "Microsoft.EntityFrameworkCore.Database.Command": "Information" } }SELECT查询语句,第二次调用没有新的SQL输出。
内容的提问来源于stack exchange,提问作者Yousaf Wazir
相关产品推荐
相关产品推荐

