我正在实现推荐用户逻辑,我当前的工作实现是
public class User
{
[Key]
public int Id { get; set; }
public UserReferral? ReferringUser { get; set; }
public List<UserReferral> ReferredUsers { get; set; } = null!;
}
public class UserReferral
{
[Key]
public int Id { get; set; }
public int ReferringUserId { get; set; }
public int ReferredUserId { get; set; }
public User ReferringUser { get; set; } = null!;
public User ReferredUser { get; set; } = null!;
}
正如人们在用户实体上看到的那样,我具有导航属性,可以直接访问引用/推荐用户。我的型号配置是
modelBuilder.Entity<User>()
.HasOne(u => u.ReferringUser)
.WithOne(u => u.ReferredUser);
modelBuilder.Entity<User>()
.HasMany(u => u.ReferredUsers)
.WithOne(u => u.ReferringUser)
.HasForeignKey(u => u.ReferringUserId);
问题: 是否可以将映射配置为在用户上直接引用和引用用户,从而能够跳过像这样的 UserReferral 包含它们?
public class User
{
[Key]
public int Id { get; set; }
public User? ReferringUser { get; set; }
public List<User> ReferredUsers { get; set; } = null!;
}
_dbContext.Users
.Include(u => u.ReferringUser )
.Include(u => u.ReferredUsers )
我使用的是最新的 .NET 8 / EF-Core 8、NpgSql 8
是的,尽管用户表需要有一个指向其引用用户的可为空的 FK。这可以在实体或影子属性中公开。在您的情况下,连接表的映射将与用户实体中声明的 RefererUserId 一起使用:
modelBuilder.Entity<User>()
.HasMany(u => u.ReferredUsers)
.WithOne(u => u.ReferringUser)
.HasForeignKey(u => u.ReferringUserId);
public class User
{
[Key]
public int Id { get; set; }
public int? ReferringUserId { get; set; }
public User? ReferringUser { get; set; }
public List<User> ReferredUsers { get; set; } = null!;
}
在这种情况下不需要连接表。像 UserReferral 这样的连接表用于多对多关系,这并不是真正的那种类型的关系,相反,您只是想要一个自引用的多对一。
自引用关系的典型问题是 FK 关系通常需要显式配置,因为在设置这些关系时,您可能会声明 ReferencUserId 属性并期望它自动链接到 ReferencUser 导航属性,但 EF 会尝试并根据类型找到 UserId1 列。通过链接 FK 的显式映射,它应该仅与用户表上的可选 RefererUserId 一起使用。