ASP.NET Core 6中如何实现用户表的多对多赞助关系
实现用户间多对多赞助关系的修改方案
当前配置使用WithOne导致仅能建立一对一关联,要实现赞助人可关联多名学生、学生可关联多名赞助人的多对多关系,需按以下步骤调整实体类与EF Core配置:
1. 修改Users实体类
将原有的单个Sponsors属性替换为集合属性,分别对应用户作为赞助人的所有赞助关系、作为被赞助人的所有赞助关系:
public class Users : IdentityUser { // 原有属性保持不变... // 替换原Sponsor1、Sponsor2属性 public ICollection<Sponsors> SponsoredUsers { get; set; } = new List<Sponsors>(); public ICollection<Sponsors> SponsorsOfUser { get; set; } = new List<Sponsors>(); // 其余原有属性... public string? RefreshToken { get; set; } public DateTime RefreshTokenExpiryTime { get; set; } }
2. 保留Sponsors实体类(无需修改)
你的Sponsors类已作为多对多关系的显式连接表,结构符合需求,无需改动:
public class Sponsors { [Key] public int SponsorhipId { get; set; } public string SponsorId { get; set; } = default!; [ForeignKey("SponsorId")] public Users Sponsor { get; set; } = default!; public string SponsoredId { get; set; } = default!; [ForeignKey("SponsoredId")] public Users Sponsored { get; set; } = default!; }
3. 更新OnModelCreating配置
将原WithOne改为WithMany,关联到Users对应的集合属性,完成多对多关系映射:
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<Users>().HasIndex(u => u.IdentificationCard).IsUnique(); // 配置赞助人到赞助关系的一对多关联 builder.Entity<Sponsors>() .HasOne(s => s.Sponsor) .WithMany(u => u.SponsoredUsers) .HasForeignKey(s => s.SponsorId) .OnDelete(DeleteBehavior.Restrict); // 配置被赞助人到赞助关系的一对多关联 builder.Entity<Sponsors>() .HasOne(s => s.Sponsored) .WithMany(u => u.SponsorsOfUser) .HasForeignKey(s => s.SponsoredId) .OnDelete(DeleteBehavior.Restrict); }
效果说明
- 配置完成后,可通过
Users.SponsoredUsers获取该用户赞助的所有学生,通过Users.SponsorsOfUser获取赞助该用户的所有赞助人。 Sponsors表会存储每一对赞助人与被赞助人的关联记录,支持任意数量的多对多关联。- 若后续需要为赞助关系添加额外属性(如赞助金额、生效时间),直接在
Sponsors类中新增字段即可,这是显式连接表的灵活优势。
内容的提问来源于stack exchange,提问作者WhackTheWise
相关产品推荐
相关产品推荐

