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

时间:2019-10-08 20:56:06

标签: asp.net-core entity-framework-core one-to-one

我已经在数据库中实现了一对一关系,但是对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,然后在User上,则正确设置了属性。

1 个答案:

答案 0 :(得分:0)

默认情况下,实体框架中的紧急加载功能处于关闭状态。否则,当仅获取一条记录时,我们最终将获取巨大的数据集。 因此,如果您希望同时在记录中加载导航属性,则必须明确地将它们包括在内。

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

注意:如果起初我请求RefreshToken,然后再请求User   然后正确设置属性。

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