Отношение один к одному в EF Core с использованием FluentAPI - PullRequest
0 голосов
/ 08 октября 2019

Я реализовал отношение 1 к 1 в моей базе данных, но ссылка на объект FK пуста.

Я покажу вам некоторый код, поскольку его будет легче объяснить.

У меня есть следующие модели:

User.cs

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }

    public RefreshToken RefreshToken { get; set; }
}

RefreshToken.cs

public class RefreshToken : Trackable
{
    public string Token { get; set; }
    public DateTime ExpiresOn { get; set; }


    public int UserRef { get; set; }
    public User User { get; set; }
}

Затем в функции onModelCreating я определил следующее с помощью FluentAPI

        modelBuilder.Entity<User>()
            .HasOne(a => a.RefreshToken)
            .WithOne(b => b.User)
            .HasForeignKey<RefreshToken>(b => b.UserRef);

        modelBuilder.Entity<RefreshToken>().HasKey(u => u.UserRef);

Все в базе данных создано, как я и ожидал.

Если я запрашиваю пользователя, используя следующий код

        _dbContext.Set<User>().Find(id);

, свойство RefreshToken имеет значение null.

Что я что-то упустил в своем коде?

Примечание. Если сначала я запрашиваю RefreshToken, а затем пользователя, то свойство устанавливается правильно.

1 Ответ

0 голосов
/ 09 октября 2019

По умолчанию активная загрузка отключена в структуре объекта. В противном случае мы бы получили огромный набор данных, когда получили бы только одну запись. Поэтому, если вы хотите загрузить навигационные свойства вместе с записью, вы должны явно включить их.

_dbContext.Set<User>().FirstOrDefault(u => u.Id == id);

Примечание. Если сначала я запрашиваю RefreshToken, а затем пользователя, то свойствоправильно установлен.

Это потому, что когда вы загружаете RefreshToken перед пользователем, Refreshtoken кэшируется в контексте данных. Затем, когда вы выбираете пользователя, EF устанавливает Refreshtoken, используя объект в кеше. Он не получает токен обновления вместе с записью пользователя.

...