【问题标题】:One to one relation in EF Core using FluentAPIEF Core 中使用 FluentAPI 的一对一关系
【发布时间】:2019-10-09 12:32:51
【问题描述】:

我在我的数据库中实现了一对一的关系,但对 FK 对象的引用为空。

我会给你看一些代码,这样更容易解释。

我有以下型号:

用户.cs

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

    public RefreshToken RefreshToken { get; set; }
}

刷新令牌.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,后来又请求用户,那么该属性设置正确。

【问题讨论】:

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


【解决方案1】:

默认情况下,在实体框架中预先加载是关闭的。否则,我们最终会在只获取一条记录时获取大量数据集。 因此,如果您还想在记录中加载导航属性,则必须明确包含它们。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2021-06-25
    • 1970-01-01
    • 2019-07-25
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多