如何在 Entity Framework 的迁移中在 "half" many-to-many 上显式设置索引或外键的名称?

How to set name of index or foreign key explicitly on "half" many-to-many in migration for Entity Framework?

我有两个类像这样。

public class Client { public Guid Id { get; set; } ... }
public class Meeting
{
  public Guid Id { get; set; }
  public Client[] Invitees { get; set; } = new Client[0];
  public Client[] Attendees { get; set; } = new Client[0];
}

上下文中的配置如下

private static void OnModelCreating(EntityTypeBuilder<Client> entity) { }

private static void OnModelCreating(EntityTypeBuilder<Meeting> entity)
{
    entity.HasMany(a => a.Invitees);
    entity.HasMany(a => a.Attendees);
}

我只需要会议中对客户的参考。客户不需要知道任何事情。会议需要参考客户两次或更少(自愿出席,可选邀请)。

上面的迁移创建了两个 table,我对此非常满意。但它也创建了两个索引,就像这样。

migrationBuilder.CreateIndex(
    name: "IX_Clients_MeetingId",
    table: "Clients",
    column: "MeetingId");

migrationBuilder.CreateIndex(
    name: "IX_Clients_MeetingId1",
    table: "Clients",
    column: "MeetingId1");

我不同意。首先,我希望只创建一个索引,因为我们正在索引 sme table 的主键。其次,如果我做不到这一点,我不喜欢 IX_Clients_MeetingId1.

中的数字
  1. 我能做什么(如果有的话)只创建一个索引?
  2. 如果我不使用 WithMany(),如何指定索引的名称?

我没有提供任何链接作为努力的证明。检查 MSDN、SO 和博客导致很多关于完整 M2M 关系的点击,即 .HasMany(...).WithMany(...) 而这不是我想要的。我看到了在迁移文件中手动进行更改的建议,但对这些进行回火会在以后出现问题。我不确定如何 google-off 不相关的结果,我开始担心我尝试的“一半”M2M 是个坏主意(没有 in-between table 创建, 例如).

好吧,似乎 EF 假设您有 2 个一对多关系。因此一位客户最多只能被邀请参加一次会议。

作为快速解决方案,您可以

  1. 显式添加 2 个连接实体并配置适当的 one2many 关系。然后你有一个 table 用于邀请和一个 出勤率。
  2. 添加一个 many2many 连接实体,它也跟踪一个 link 输入 (Client, Meeting, LinkType) 以便“邀请”和 “参加”是 link 类型
  3. 向客户端添加 2 个属性以向 EF 显示 你的意思是这是一个多对多的关系:

像这样:

public class Client { 
  public Guid Id { get; set; }
  public ICollection<Meeting> InvitedTo { get; set; }
  public ICollection<Meeting> Attended { get; set; }
}

这些不应显示在客户端 table 中,而是显示为 2 个单独的 table。 (本质上是带有隐式连接实体的解决方案1)

退一步说,我认为您可以通过引入 MeetingMember 实体来简单地改进模型。在当前模型中,无法邀请客户参加两次会议,客户也不会被限制参加他们被邀请参加的会议。所以你需要一个 M2M 关系,如果你使用一个明确的链接实体,你就可以摆脱这种关系,比如

MeetingMember(MeetingId, ClientId, InvitedAt, Attended)