同一实体之间的一对多和多对多关系

Posted

技术标签:

【中文标题】同一实体之间的一对多和多对多关系【英文标题】:One-to-many and many-to-many relationship between the same entities 【发布时间】:2022-01-05 00:40:13 【问题描述】:

假设我想为用户和拍卖之间的关系建模。一个用户可以主持一个拍卖,其他用户可以在其中出价,同时他也可以在其他用户的拍卖中出价。所以我想要一个 User 表、一个带有对 User 表的外键引用的 Auction 表,以及一个AuctionBidders 表。

我必须在下面的代码或 OnModelCreating() 方法中添加/更改什么才能使其工作?

public class User

    public int Id  get; set; 
    public ICollection<Auction> Auctions  get; set; 


public class Auction

    public int Id  get; set; 
    public User Host  get; set; 
    public ICollection<User> Bidders  get; set; 

【问题讨论】:

【参考方案1】:

假设一个action只能有一个Host,但同一个用户可以是多个拍卖的Host,你也必须为Host添加关系

public class User

    public int Id  get; set; 
     [InverseProperty(nameof(Auction.Host))]
     public ICollection<Auction> Hosts  get; set; 
 
    public ICollection<Auction> Auctions  get; set; 


public class Auction

    public int Id  get; set; 

    public int HostId  get; set; 

    [ForeignKey(nameof(HostId))]
    [InverseProperty(nameof(User.Hosts))]
    public User Host  get; set; 

    public ICollection<User> Users  get; set; 

ef core 5+ 将为您创建第三个表,但我更愿意明确添加它,因为您有非标准的 db 结构

public class AuctionUser
   
    [Key]
    public int Id  get; set; 
   
     public int AuctionId  get; set; 
      
     [ForeignKey(nameof(AuctionId))]
      [InverseProperty("Users")]
     public virtual Auction Auction  get; set; 

      public int UserId  get; set; 

      [ForeignKey(nameof(UserId))]
      [InverseProperty("Auctions")]
      public virtual User User  get; set; 

【讨论】:

如果用户可以对他拥有的选项以外的许多选项进行投标,则可以假设用户和拍卖之间存在 m-m 关系,因此问题中提到的第三个表,即 AuctionBidders 表。 @NoChance 感谢您的反馈。我只是假设一个动作只能有一个主机,否则将需要一个主机表。 是的,有道理。谢谢。 @Serge 看起来需要更多约束才能工作。错误是:在表 'AuctionUser' 上引入 FOREIGN KEY 约束 'FK_AuctionUser_Users_UsersId' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

以上是关于同一实体之间的一对多和多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一对一对多和多对多的关系

简述数据库设计中一对多和多对多的应用场景?

多表关系一对多和多对多

具有一对多和多对多关系的 JOOQ pojos

如何在 DynamoDB 中建模一对一、一对多和多对多关系

MySQL——一对多和多对多简单模型建表