提问人:Neo 提问时间:7/1/2020 更新时间:7/2/2020 访问量:1646
如何为一对多关系提供中间表?
How to have intermediate table for a 1 to many relationship?
问:
我有一个模型类:
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?
还是我把整个概念弄错了?
谢谢。
答:
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; }
}
将主键添加到中间表。只能有一个值,但可以有很多值,就像关系一样。UserAddress
AddrId
UserID
one-to-many
还是我把整个概念弄错了?
没什么不对的。像你所做的那样使用导航属性也很好。
评论
0赞
Neo
7/12/2020
嗨,我愿意相信我做到了。我还将使用控制器代码扩展问题,以便任何查找此代码的人都可以全面了解其工作原理。感谢您的帮助,顺便说一句:)
下一个:一对多关系 LINQ 更新查询
评论