Asp.net core 使用FluentAPI的EF Core中的一对一关系
我在数据库中实现了1对1关系,但对FK对象的引用为null 我将向您展示一些代码,因为这样更容易解释 我有以下型号: User.csAsp.net core 使用FluentAPI的EF Core中的一对一关系,asp.net-core,entity-framework-core,one-to-one,Asp.net Core,Entity Framework Core,One To One,我在数据库中实现了1对1关系,但对FK对象的引用为null 我将向您展示一些代码,因为这样更容易解释 我有以下型号: User.cs public class User { public int Id { get; set; } public string Username { get; set; } public RefreshToken RefreshToken { get; set; } } RefreshToken.cs public class Refres
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);
modelBuilder.Entity()
.HasOne(a=>a.RefreshToken)
.WithOne(b=>b.User)
.HasForeignKey(b=>b.UserRef);
modelBuilder.Entity().HasKey(u=>u.UserRef);
数据库中的所有内容都按照我的预期创建
如果我使用以下代码请求用户
_dbContext.Set<User>().Find(id);
\u dbContext.Set().Find(id);
属性RefreshToken为空
我在代码中遗漏了什么
注意:如果我首先请求RefreshToken,然后请求用户刷新Token,则属性设置正确。默认情况下,entity framework中的“急切加载”处于禁用状态。否则,当只获取一条记录时,我们将最终获取大量数据集。 因此,如果您想加载导航属性以及记录,您必须显式地包含它们
_dbContext.Set<User>().FirstOrDefault(u => u.Id == id);
\u dbContext.Set().FirstOrDefault(u=>u.Id==Id);
注意:如果我先请求RefreshToken,然后请求用户
然后正确设置属性
这是因为当您在用户之前加载RefreshToken时,RefreshToken会缓存在数据上下文中。然后,在获取用户时,EF使用缓存中的对象设置Refreshtoken。它没有将刷新令牌与用户记录一起提取。关系配置正常。你缺少的是。