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

时间:2019-03-17 17:06:10

标签: 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; }
}`

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

`public class User : IdentityUser
  {
    public RefreshToken RefreshToken { get; set; }
}`

这是我使用_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;
}`

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

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

      if(user == null || user.RefreshToken.Token != refreshToken) return BadRequest();`

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

我尝试使用流畅的API创建这种关系。结果一样。刷新令牌已使用表中的正确用户ID成功保存到数据库中,但是导航属性不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您应该修改以下行:

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

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

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

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