首页 > 解决方案 > 多个主键连接2个表

问题描述

我曾经在下面的 UserGroup 表中创建一个额外的 Id 列,然后我意识到这似乎是错误的。

用户:

Id    |   Name     |
--------------------
1     |   Tim      |
2     |   Willy    |
3     |   Mary     |
4     |   Jonathan |
5     |   Mary     |

团体:

Id    |   Name   |
------------------
1     |   Bees   |
2     |   Ants   |

用户组:

Id    |   UserId   |  GroupId  |
--------------------------------
1     |   1        |  1        |
2     |   2        |  1        |
3     |   3        |  2        |
4     |   4        |  2        |
5     |   5        |  2        |

那么,您能否就以下问题向我澄清一下:

1)由于 UserGroup 表中可能有一个 UserId - GroupId 对,因此使用额外的 Id 列肯定是多余的,不需要使用此 Id 列,是这样吗?是否有特殊情况需要使用这个额外的 Id 列?

2)删除UserGroup表中的Id列,我需要将两列都设为PK。那么,我怎样才能在 EF Code First 中做到这一点?下面的定义是真的吗?

public class UserGroup
{
    [Key]
    public int UserId { get; set; }

    [Key]
    public int GroupId { get; set; }
}

标签: sql-serverdatabaseoraclepostgresqlentity-framework

解决方案


您上面的任何一种解决方案都会有一个用例(有或没有 Id 列)。通常,如果表的目标是简单地关联两组数据,则不需要新的 Id,您可以使用复合键来定义 UserGroup 的 Id。可以在此处找到阅读内容:https ://docs.microsoft.com/en-us/ef/core/modeling/keys?tabs=data-annotations 。看起来您可能必须使用 Fluent API 而不是本文档中的数据注释。

还有另一种情况,在为用户和组形成 M 到 N 连接时,您可能需要一个 Id 列。如果您计划将任何数据连接到该连接,则使用 Id 来创建从其他表到用户组的外键会更容易。特别是在您的情况下,我认为可能会在您创建 UserGroups 后不久引入 UserGroupPermissions。您可以为此 ID 设置一个非聚集标识列,但我不推荐它。如果您希望表具有带有 Id 的记录,最好尽可能将其用作聚集索引和主键。


推荐阅读