【问题标题】:Why is EF core one-to-one relationship not working as expected?为什么 EF 核心一对一关系没有按预期工作?
【发布时间】:2019-03-18 01:36:05
【问题描述】:

我有一个用户和一个 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 属性为空。

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

【问题讨论】:

  • 您的 RefreshToken 具有“用户”作为导航属性,但似乎同时使用 userId 和 refreshtokenid 作为外键。你的目标是什么?让 RefreshTokenId 唯一,还是与 UserId 相同?
  • 我希望 RefreshToken 是唯一的,并且每个用户只有一个。

标签: c# entity-framework-core asp.net-core-webapi


【解决方案1】:

你应该修改这一行:

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

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

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

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

【讨论】:

  • 你就是男人!来自自动为您执行此操作的 Rails 和 ActiveRecord,我经常忘记使用 EF 时必须记住的这些小“陷阱”。谢谢你的回复。节省了我大量时间研究一个相当简单的主题,即一对一的 EF 关系。
猜你喜欢
  • 2016-08-06
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2014-08-04
  • 2021-01-03
  • 2018-11-08
相关资源
最近更新 更多