Мы разрабатываем приложения с .NET Core и EF Core с Code First, поэтому мы используем миграции для создания и расширения базы данных. Приложение будет использоваться для настройки соглашений. Так и с докладчиками, сессиями и разными предметами. У меня есть две сущности. WishlistSpeaker и Track, и они образуют отношения "многие ко многим". С помощью Fluent API я создал таблицу соединений с идентификатором из обеих таблиц. Теперь, когда я создаю wishlistSpeaker со списком треков, он аккуратно сохраняется в таблице соединений WishlistspeakerTrack. Когда я пытаюсь обновить этот WishlistSpeaker и добавить или удалить трек, динамик и WishlistSpeakerTracks удаляются. Я не вижу ошибок в моей отладке.
Я попытался изменить действия onDelete и OnUpdate в процессе миграции, а затем повторно применить их. Поскольку я не вижу ошибок в своем коде, я думаю, что это как-то связано с БД, поэтому я провел большую часть своего времени в поисках.
The WishlistSpeaker Entity
public class WishlistSpeaker
{
[Key]
public int WishlistSpeakerId { get; set; }
public string FirstName { get; set; }
public string Name { get; set; }
public int EventID { get; set; }
public string Company { get; set; }
public string Mail { get; set; }
public string Country { get; set; }
public string Twitter { get; set; }
public List<WishlistSpeakerTrack> WishlistSpeakerTracks { get; set; }
public int StatusId { get; set; }
public Status Status { get; set; }
public string LinkedIn { get; set; }
}
Трек сущность
public class Track
{
[Key]
public int TrackId { get; set; }
[Required]
public string TrackName { get; set; }
public int EventId { get; set; }
public Event Event { get; set; }
public List<WishlistSpeakerTrack> WishlistSpeakerTracks { get; set; }
}
Это сущность, созданная для JoinTable
public class WishlistSpeakerTrack
{
[Key]
public int TrackId { get; set; }
public Track Track { get; set; }
[Key]
public int WishlistSpeakerId { get; set; }
public WishlistSpeaker WishlistSpeaker { get; set; }
}
Это то, что создается в процессе миграции. OnDelete теперь установлен на NoAction, но раньше он был Restrict
migrationBuilder.CreateTable(
name: "WishlistSpeakerTrack",
columns: table => new
{
TrackId = table.Column<int>(nullable: false),
WishlistSpeakerId = table.Column<int>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WishlistSpeakerTrack", x => new { x.TrackId, x.WishlistSpeakerId });
table.ForeignKey(
name: "FK_WishlistSpeakerTrack_Track_TrackId",
column: x => x.TrackId,
principalTable: "Track",
principalColumn: "TrackId",
onDelete: ReferentialAction.NoAction);
table.ForeignKey(
name: "FK_WishlistSpeakerTrack_WishlistSpeakers_WishlistSpeakerId",
column: x => x.WishlistSpeakerId,
principalTable: "WishlistSpeakers",
principalColumn: "WishlistSpeakerId",
onDelete: ReferentialAction.NoAction);
});
Я не хочу обновлять мой WishlistSpeaker и JoinTable без того, чтобы оба были удалены.
Я сделал и то, и другое не работает. Я думаю, что нашел свою проблему. В моем ContextModelSnapshot все еще установлено значение onDelete: ReferentialAction.Cascade
Как мне это изменить?
modelBuilder.Entity("Oganize.Api.Core.Entities.WishlistSpeakerTrack", b =>
{
b.HasOne("Oganize.Api.Core.Entities.Track", "Track")
.WithMany("WishlistSpeakerTracks")
.HasForeignKey("TrackId")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("Oganize.Api.Core.Entities.WishlistSpeaker", "WishlistSpeaker")
.WithMany("WishlistSpeakerTracks")
.HasForeignKey("WishlistSpeakerId")
.OnDelete(DeleteBehavior.Cascade);
});
onDelete: ReferentialAction.Cascade
который является значением по умолчанию для этого типа отношений, каскадное удаление работает по-другому - от первичных таблиц до объединяемой таблицы. Требуется минимальный воспроизводимый пример .