为什么 EF 核心一对一关系没有按预期工作?

O.M*_*Koh 1 c# entity-framework-core asp.net-core-webapi

我有一个用户和一个 RefreshToken。我需要在这两个对象之间创建一对一的关系。我的 RefreshToken 对象看起来像这样

`public class RefreshToken
    {
        [ForeignKey("User")]
        public string RefreshTokenID { get; set; }
        public string UserId { get; set; }
        public User User { get; set; }
        public string Token { get; set; }
}`
Run Code Online (Sandbox Code Playgroud)

我的用户对象看起来像这样

`public class User : IdentityUser
  {
    public RefreshToken RefreshToken { get; set; }
}`
Run Code Online (Sandbox Code Playgroud)

以下是我如何使用 _refreshTokenRepository 为用户保留 RefreshToken:

`public async Task<bool> SaveAsync(User user, string newRefreshToken, CancellationToken ct = default(CancellationToken))
    {
      if(user.RefreshToken != null) return false;
      RefreshToken rt = new RefreshToken(newRefreshToken, DateTime.Now.AddDays(5), user.Id);

      await _dbContext.RefreshTokens.AddAsync(rt);      
      await _dbContext.SaveChangesAsync(ct);
return true;
}`
Run Code Online (Sandbox Code Playgroud)

当用户被重定向到“/refresh”路由时,以及当我需要根据从客户端返回的刷新令牌检查用户的刷新令牌时,就会发生此问题。此属性检查始终是null

`var user = _userManager.Users.SingleOrDefault(u => u.UserName == username);

      if(user == null || user.RefreshToken.Token != refreshToken) return BadRequest();`
Run Code Online (Sandbox Code Playgroud)

该用户实际上是正确的用户并且已找到,但 RefreshToken 属性为 null。

我尝试过使用 Fluent API 来创建这种关系。同样的结果。刷新令牌已成功保留到数据库,并且表中具有正确的用户 ID,但导航属性不起作用。有什么想法吗?

Mar*_*pic 5

您应该修改这一行:

var user = _userManager.Users.SingleOrDefault(u => u.UserName == username);
Run Code Online (Sandbox Code Playgroud)

通过添加.Include(u => u.RefreshToken),因此该行应如下所示:

var user = _userManager.Users.Include(u => u.RefreshToken).SingleOrDefault(u => u.UserName == username);
Run Code Online (Sandbox Code Playgroud)

这将告诉商店也加载相关RefreshToken实体。