如何配置User、Auction实体的一对多及多对多关联关系?
实现需求需要调整实体类 + 手动配置OnModelCreating映射规则,因为User和Auction之间存在两套关联关系,EF Core无法自动识别对应逻辑,具体修改如下:
第一步:调整实体类代码
显式区分用户作为「主办方」和「竞价者」的两个关联集合,同时显式声明主办方外键,避免EF生成非预期的隐式字段:
public class User { public int Id { get; set; } // 作为主办方发起的拍卖集合 public ICollection<Auction> HostedAuctions { get; set; } = new List<Auction>(); // 作为竞价者参与的拍卖集合 public ICollection<Auction> ParticipatedAuctions { get; set; } = new List<Auction>(); } public class Auction { public int Id { get; set; } // 显式声明主办方外键 public int HostId { get; set; } // 主办方导航属性 public User Host { get; set; } // 当前拍卖的所有竞价用户集合 public ICollection<User> Bidders { get; set; } = new List<User>(); }
注:实体类中直接初始化集合是为了避免后续操作出现空引用异常,也可以放到实体构造函数中实现
第二步:配置OnModelCreating方法
手动指定两套关系的映射规则,同时生成你需要的AuctionBidders中间表:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置1对多的「主办方-拍卖」关系 modelBuilder.Entity<Auction>() .HasOne(a => a.Host) .WithMany(u => u.HostedAuctions) .HasForeignKey(a => a.HostId) // 禁止级联删除,避免循环引用报错,可根据业务需求调整删除行为 .OnDelete(DeleteBehavior.Restrict); // 配置多对多的「竞价用户-拍卖」关系,指定中间表为AuctionBidders modelBuilder.Entity<Auction>() .HasMany(a => a.Bidders) .WithMany(u => u.ParticipatedAuctions) .UsingEntity<Dictionary<string, object>>("AuctionBidders", // 配置中间表关联User的外键 j => j .HasOne<User>() .WithMany() .HasForeignKey("BidderId") .OnDelete(DeleteBehavior.Restrict), // 配置中间表关联Auction的外键 j => j .HasOne<Auction>() .WithMany() .HasForeignKey("AuctionId") .OnDelete(DeleteBehavior.Restrict), // 配置中间表联合主键 j => { j.HasKey("BidderId", "AuctionId"); }); }
补充说明
如果你需要给中间表加额外业务字段(比如竞价时间、出价金额),可以单独声明AuctionBidders实体类,把需要的属性补上,再把UsingEntity里的泛型Dictionary<string, object>替换为你自定义的AuctionBidders类即可。
内容的提问来源于stack exchange,提问作者Glauvus
相关产品推荐
相关产品推荐

