我已经在数据库中实现了一对一关系,但是对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上,则正确设置了属性。
答案 0 :(得分:0)
默认情况下,实体框架中的紧急加载功能处于关闭状态。否则,当仅获取一条记录时,我们最终将获取巨大的数据集。 因此,如果您希望同时在记录中加载导航属性,则必须明确地将它们包括在内。
_dbContext.Set<User>().FirstOrDefault(u => u.Id == id);
注意:如果起初我请求RefreshToken,然后再请求User 然后正确设置属性。
那是因为当您在User之前加载RefreshToken时,Refreshtoken会缓存在数据上下文中。然后,当您提取用户时,EF使用缓存中的对象设置Refreshtoken。它不会与用户记录一起获取刷新令牌。