EF Core 8中如何配置用户推荐关系的直接导航属性?
配置EF Core实现用户实体的自关联推荐导航属性
1. 定义User实体
调整User实体,添加外键属性与对应导航属性:
public class User { public int Id { get; set; } // 其他用户核心属性 public string Username { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; // 推荐者外键(可为空,支持无推荐者的用户) public int? ReferringUserId { get; set; } // 推荐者导航属性 public User? ReferringUser { get; set; } // 被推荐用户列表导航属性 public ICollection<User> ReferredUsers { get; set; } = new List<User>(); }
2. 配置EF Core自关联关系
在DbContext的OnModelCreating方法中,用Fluent API明确自关联映射规则,同时规避自关联的级联删除风险:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>(entity => { // 配置推荐者→被推荐者的一对多自关联 entity.HasOne(u => u.ReferringUser) .WithMany(u => u.ReferredUsers) .HasForeignKey(u => u.ReferringUserId) .OnDelete(DeleteBehavior.Restrict); // 禁止级联删除,避免删除推荐者时误删所有被推荐用户 }); // 其他实体配置逻辑... }
3. 关联查询示例
现在可直接通过Include加载关联数据,无需依赖中间实体:
// 查询用户及其推荐者 var userWithReferrer = await dbContext.Users .Include(u => u.ReferringUser) .FirstOrDefaultAsync(u => u.Id == targetUserId); // 查询用户及其所有被推荐用户 var userWithReferredList = await dbContext.Users .Include(u => u.ReferredUsers) .FirstOrDefaultAsync(u => u.Id == targetUserId); // 多层级链式查询(如用户的推荐者的推荐者) var userWithReferrerChain = await dbContext.Users .Include(u => u.ReferringUser) .ThenInclude(r => r.ReferringUser) .FirstOrDefaultAsync(u => u.Id == targetUserId);
关键说明
ReferringUserId设为可空类型,确保无推荐者的用户能正常入库。OnDelete(DeleteBehavior.Restrict)适配PostgreSQL(Npgsql)特性,防止默认级联删除引发的业务数据风险。- 该配置完全替代原有
UserReferral中间实体,通过自关联外键+导航属性简化关联逻辑,提升查询效率。
内容的提问来源于stack exchange,提问作者VladL
相关产品推荐
相关产品推荐

