EF Core 中使用 FluentAPI 的一对一关系

One to one relation in EF Core using FluentAPI

我在我的数据库中实现了 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 为空。

我的代码中遗漏了什么?

注意:如果一开始我请求 RefreshToken,然后请求用户,那么 属性 设置正确。

默认情况下,预加载在 entity framework 中处于关闭状态。否则我们会在只获取一条记录时获取大量数据集。 因此,如果您还想随记录一起加载导航属性,则必须明确包含它们。

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

Note: If at first I request the RefreshToken and later on the User then the property is correctly set.

那是因为当你在用户之前加载 RefreshToken 时,Refreshtoken 被缓存在数据上下文中。然后,当您获取用户时,EF 使用缓存中的对象设置 Refreshtoken。它没有随用户记录一起获取刷新令牌。