多对多绑定导航属性

问题描述 投票:0回答:1

我正在实现推荐用户逻辑,我当前的工作实现是

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

c# .net postgresql entity-framework entity-framework-core
1个回答
0
投票

是的,尽管用户表需要有一个指向其引用用户的可为空的 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 一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.