Создание записи для структуры сущностей с отношениями к другим записям: минимальный API ASP.NET Core 6 (SQL/Postgres)

У меня есть две таблицы, Participantа также Meeting, в минимальном проекте API ASP.NET Core 6, настроенном следующим образом:

      record Participant(int id)
{
    public string name { get; set; } = default!;
    public string title { get; set; } = default!;
}

record Meeting(int id)
{
    public string subject { get; set; } = default!;
    public string organizer { get; set; } = default!;
    public DateTime starttime { get; set; } = default!;
    public DateTime endtime { get; set; } = default!;
}

class MyDb: DbContext 
{
    public MyDb(DbContextOptions<MyDb> options): base(options) 
    {
    }

    public DbSet<Participant> Participants => Set<Participant>();

    public DbSet<Meeting> Meetings => Set<Meeting>();
}

Теперь мне нужно создать объединяющую таблицу/запись, которая соединяет эти две таблицы/записи.

В SQL это будет эта таблица

      CREATE TABLE meetings_participants
(
    meeting_id int NOT NULL,
    participant_id int NOT NULL,
    PRIMARY KEY (meeting_id, participant_id),
    CONSTRAINT fk_meeting_id 
        FOREIGN KEY (meeting_id) REFERENCES meetings(id),
    CONSTRAINT fk_participant_id 
        FOREIGN KEY (participant_id) REFERENCES participants(id)
);

Но как мне записать это в EF как запись с внешними ключами?

1 ответ

Вы можете создать класс MeetingParticipant, например:

      public class MeetingParticipant
{
    public int  ParticipantID { get; set; }
    [ForeignKey("ParticipantID")]
    public virtual Participant Participant { get; set; }
    public int MeetingID { get; set; }
    [ForeignKey("MeetingID")]
    public virtual Meeting Meeting { get; set; }
}

И обновите класс участника и собрания, как показано ниже:

      public record Participant(int id)
{
    public string name { get; set; } = default!;
    public string title { get; set; } = default!;

    public List<MeetingParticipant> MeetingParticipant { get; set; }
}

public record Meeting(int id)
{
    public string subject { get; set; } = default!;
    public string organizer { get; set; } = default!;
    public DateTime starttime { get; set; } = default!;
    public DateTime endtime { get; set; } = default!;
    public List<MeetingParticipant> MeetingParticipant { get; set; }
}

Затем обновите ApplicationDbContext (вы можете изменить его на свой), как показано ниже:

      public class ApplicationDbContext : IdentityDbContext
{ 
    public DbSet<Participant> Participants => Set<Participant>();

    public DbSet<Meeting> Meetings => Set<Meeting>();

    public DbSet<MeetingParticipant> MeetingParticipant { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    { 
        base.OnModelCreating(modelBuilder);
        //set the primary key
        modelBuilder.Entity<MeetingParticipant> ().HasKey(mp=> new { mp.MeetingID, mp.ParticipantID}); 
    }

Затем включите миграцию с помощью команды миграции EF, например (при использовании Visual Studio):

      Add-Migration AddMeetingParticipant
Update-Database

Затем он настроит «многие ко многим» между таблицами «Участник» и «Совещание», а таблица «Участник совещания» будет использоваться для хранения взаимосвязей.

Дополнительные сведения о взаимосвязи ядра EF см. в следующих статьях:

Отношения «многие ко многим»

Настройка отношений «многие ко многим» в Entity Framework Core

Другие вопросы по тегам