怎么有一对多关系的中间表?

时间:2020-07-01 10:48:31

标签: entity-framework asp.net-core .net-core entity-framework-core ef-core-3.1

我有一个模型课:

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具有一对多关系,即:

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

因此,除了在地址主控器上没有外键之外,我们如何在地址主控器和用户配置文件之间创建一个中间表,以及在地址主控器和剧院之间的另一个此类表?

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

谢谢。

2 个答案:

答案 0 :(得分:1)

您的表定义可能会变成这样:

UserProfile
    UserId PK

Theather
    TheatreId PK

Address
    AddrID PK
    AddressLine1 

UserAddress
    UserId PK & FK
    AddressId FK

TheatreAddress
    TheatreID PK & FK
    AddressId FK

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

例如仅在UserId上的中间表上的PK可以确保这是一个多对多。

答案 1 :(得分:1)

因此,除了在addressmaster上没有外键之外,我们怎么能 地址管理员和用户个人资料之间的中间表& 另一个这样的表黑白地址主和剧院?

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

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; }
}

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

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

没错。像您一样使用导航属性也不错。

相关问题