如何为一对多关系提供中间表?

How to have intermediate table for a 1 to many relationship?

提问人:Neo 提问时间:7/1/2020 更新时间:7/2/2020 访问量:1646

问:

我有一个模型类:

public class UserProfile
{
        public string UserID { get; set; }
        public string Name{ get; set; }
        public ICollection<AddressMaster> AddressMaster { get; set; }
}

上面的类与下面给出的 AddressMaster 模型类具有一对多的关系:

public class AddressMaster
{
        public string AddrID{ get; set; }
        public string AddressLine1{ get; set; }
        public UserProfile UserProfile { get; set; }
        public TheatreLocation TheatreLocation { get; set; }
}

问题是,还有另一个模型也与 addressmaster 具有 1 对多的关系,即:

public class TheatreLocation
{
        public string LocationID { get; set; }
        public string Name{ get; set; }
        public ICollection<AddressMaster> AddressMaster { get; set; }
}

因此,我们如何在 addressmaster 和 userprofile 之间有一个中间表,而不是在 addressmaster 和 userprofile 之间有一个中间表,以及另一个这样的表黑白 addressmaster 和 theatre?

还是我把整个概念弄错了?

谢谢。

实体框架 asp.net-core 实体框架核心 ef-core-3.1

评论


答:

2赞 Paddy 7/1/2020 #1

您的表定义可能会像这样结束:

UserProfile
    UserId PK

Theather
    TheatreId PK

Address
    AddrID PK
    AddressLine1 

UserAddress
    UserId PK & FK
    AddressId FK

TheatreAddress
    TheatreID PK & FK
    AddressId FK

这是一个很好的规范化 - 即数据库中有一个通用的“地址”表。多个实体可能有一个地址,并且与地址具有一对多或多关系,但特定地址只需要记录一次。

中间表上的 PK 仅在 UserId(例如)上确保这是一对多而不是多对多。

2赞 Rena 7/2/2020 #2

因此,与其在地址主节点处拥有外键,不如在地址主节点上拥有外键 AddressMaster 和 UserProfile 之间的中间表 & 另一个这样的桌子黑白地址主和剧院?

如果您不想设置任何外键并添加中间表。设计如下:

public class UserProfile
{
    [Key]
    public string UserID { get; set; }
    public string Name { get; set; }       
}
public class AddressMaster
{
    [Key]
    public string AddrID { get; set; }
    public string AddressLine1 { get; set; }
}
public class UserAddress
{       
    [Key]
    public string AddrID { get; set; }
    public string UserID { get; set; }
}

将主键添加到中间表。只能有一个值,但可以有很多值,就像关系一样。UserAddressAddrIdUserIDone-to-many

还是我把整个概念弄错了?

没什么不对的。像你所做的那样使用导航属性也很好。

评论

0赞 Neo 7/12/2020
嗨,我愿意相信我做到了。我还将使用控制器代码扩展问题,以便任何查找此代码的人都可以全面了解其工作原理。感谢您的帮助,顺便说一句:)