【问题标题】: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; }
}

【问题讨论】:

    标签: c# entity-framework .net-core entity-framework-core


    【解决方案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 约束。
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2021-04-14
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多