Связь моделей в 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 шт):
В большинстве случаев имеет смысл обратиться к той сущности, которую вы хотите в итоге получить
var token = _libraryContext.RefreshTokens
.Where(x=>x.User.Login == XXX && x.Token == YY)
.Select(x=>x.Token)
.FirstOrDefault();