Создание записи для структуры сущностей с отношениями к другим записям: минимальный 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