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。它没有随用户记录一起获取刷新令牌。
我在我的数据库中实现了 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。它没有随用户记录一起获取刷新令牌。