Связь моделей в EF Core

Есть две модели:

public class User : IEntity
{
    public int Id { get; set; }
    public string Login { get; set; }
    public string Password { get; set; }
    public string PhoneNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Role { get; set; } = "user";
    public List<RefreshToken> RefreshTokens { get; set; }
}

public class RefreshToken : IEntity
{       
    [Key]
    public int Id { get; set; }
    public string Token { get; set; }
    public DateTimeOffset Expiration { get; set; }
    [ForeignKey("UserId")]
    public int UserId { get; set; }
    public User User { get; set; }
}

Несмотря на то, что навигационное свойство есть, FK есть, когда я пытаюсь посмотреть _context.Users.RefreshTokens, там нет ничего. Не понимаю, вроде ведь все правильно? Почему тогда null?

Update:

По всей видимости не хватает Include в запросе, поэтому попробовал добавить, но выглядит ужасно, можете посоветовать, как исправить? Или лучше так не делать, отказаться от навигационных свойств и просто делать поиск по таблице токенов через Where(p => p.UserId == user.Id)?

var userTokens = _libraryContext.Users.Where(p => p.Login == username)
    .Include(p => p.RefreshTokens);
var savedRefreshToken = userTokens.Select(p => p.RefreshTokens)
    .Select(t => t.Where(p => p.Token == requestModel.OldRefreshToken)
    .FirstOrDefault()
    .FirstOrDefault()
    .Token;

Два FirstOrDefault() здесь потому что после первого возвращается IEnumerable<RefreshToken>, а после второго - непосредственно RefreshToken.


Ответы (1 шт):

Автор решения: tym32167

В большинстве случаев имеет смысл обратиться к той сущности, которую вы хотите в итоге получить

var token = _libraryContext.RefreshTokens
                    .Where(x=>x.User.Login == XXX && x.Token == YY)
                    .Select(x=>x.Token)
                    .FirstOrDefault();
→ Ссылка