同一实体之间的一对多和多对多关系
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 约束。以上是关于同一实体之间的一对多和多对多关系的主要内容,如果未能解决你的问题,请参考以下文章