EF Core中查询Users时关联的RefreshToken始终为null求助
EF Core关联RefreshToken始终为null的问题解决
问题根源
- 缺失外键与关联配置:RefreshToken实体没有指向Users的外键属性,DbContext的
OnModelCreating也未配置两者的一对多关联关系,导致EF Core无法识别导航属性的关联逻辑。 - 未加载关联数据:EF Core默认不会自动加载导航属性,即使关联配置正确,也需要显式或通过延迟加载来获取关联数据。
具体解决步骤
1. 完善RefreshToken实体,添加外键与导航属性
public partial class RefreshToken { [Key] [JsonIgnore] public int Id { get; set; } public string Token { get; set; } // 添加关联Users的外键 public int UserId { get; set; } // 添加指向Users的导航属性 [JsonIgnore] public virtual Users User { get; set; } }
2. 在DbContext中配置关联关系
更新OnModelCreating方法,明确配置Users和RefreshToken的一对多关联:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<RefreshToken>(entity => { entity.Property(e => e.Token) .IsRequired() .HasMaxLength(255) .IsUnicode(false); // 配置外键关联,指定RefreshToken属于一个User,一个User对应多个RefreshToken entity.HasOne(d => d.User) .WithMany(p => p.RefreshToken) .HasForeignKey(d => d.UserId) .OnDelete(DeleteBehavior.Cascade); // 可根据业务调整删除行为 }); modelBuilder.Entity<Users>(entity => { entity.Property(e => e.Id).HasColumnName("id"); }); ... }
3. 查询时显式加载关联数据
修改查询方法,使用Include显式加载RefreshToken导航属性,确保获取到关联数据:
private Users getUserByRefreshToken(string token) { var user = _context.Users .Include(u => u.RefreshToken) // 显式加载关联的RefreshToken集合 .SingleOrDefault(u => u.RefreshToken.Any(t => t.Token == token)); if (user == null) throw new AppException("Invalid token"); return user; }
若偏好延迟加载,需满足两个条件:
- 导航属性保持
virtual(你的代码已满足) - 在DbContext配置中启用延迟加载:
注意需先安装protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLazyLoadingProxies() // 启用延迟加载代理 .UseSqlServer("你的连接字符串"); }Microsoft.EntityFrameworkCore.ProxiesNuGet包。
内容的提问来源于stack exchange,提问作者pryxen
相关产品推荐
相关产品推荐

