如果 Table1 与 CommonTable 具有一对多关系,我会将其定义为 Table1.Id = CommonTable.Table1Id。
如果我需要创建与 CommonTable 具有相同一对多关系的 Table2,该怎么办?
我会吗:
在以下示例中,附件记录的创建源自客户记录,但如果它可以源自 N+1 种不同的记录类型怎么办?:
public async Task<ActionResult> Create(int? clientId)
{
if (clientId == null)
{
return NullIdActionResult("client", ControllerName, AreaName);
}
var clientModel = await _db.Clients.FindAsync(clientId);
if (clientModel == null)
{
return ModelNotFoundActionResult("client", clientId.ToString(), ControllerName, AreaName);
}
var vm = new AttachmentViewModel
{
Attachment = new Attachment
{
ClientId = clientModel.Id
},
Mode = Enums.Mode.Add
};
return View($"{ViewBase}/Form.cshtml", vm);
}
如果不了解这些
one-to-many
关系的本质,就有点难以理解。如果我猜对了,你会遇到一个场景,其中有 Attachment
(你在问题开头所命名的 CommonTable
)引用了 Client
。您希望将同一个表用于与其他实体相关的 Attachments
。
在这种情况下,最佳选择将取决于您使用的 ORM。
带有多个
X_Attachment
表的选项 #1 看起来最糟糕:你必须支持多个几乎相同的表,我不知道是否可以使用任何 ORM 进行映射。
选项 #2,在
Attachment
表上有多个外键,是最简单的,并且在您只有很少可能的“父项”的情况下可以很好地工作。但是,如果您有太多可能的“父母”,那么添加和管理所有这些键会看起来很丑并且会让人头疼。
选项 #3,带有
ParentId
和 ParentType
如果你有很多选项 ParentType
,那将是我的选择。虽然我不认为您可以在此配置中设置外键,但您仍然可以添加触发器以确保数据完整性。