Я использую Entity Framework - Code First и столкнулся с проблемой, когда мне нужно отключить каскадное удаление для определенного внешнего ключа.
Вот мой класс сущности:
public class ChallengeMatch
{
public int Id { get; set; }
public int ChallengerClubMemberId { get; set; }
public int ChallengeeClubMemberId { get; set; }
public bool ChallengerWon { get; set; }
public string Score { get; set; }
public virtual ClubMember ChallengerClubMember { get; set; }
public virtual ClubMember ChallengeeClubMember { get; set; }
}
Если я позволю Code First создать базу данных для этой таблицы со всеми параметрами по умолчанию (включая каскадное удаление), он выдаст исключение при попытке создать объекты базы данных.
Если я добавлю следующий код в свой класс DbContext
, я больше не буду получать исключение, но теперь каскадные удаления будут несколько работать:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ChallengeMatch>()
.HasRequired(cm => cm.ChallengeeClubMember)
.WithMany()
.HasForeignKey(cm => cm.ChallengeeClubMemberId)
.WillCascadeOnDelete(false);
}
Из-за этого мне приходится писать код вручную. В частности, если я собираюсь удалить ClubMember 13, я должен удалить любой ChallengeMatch, чей ChallengeeClubMemberId равен 13.
Чего я не понимаю, так это зачем все это нужно. Почему SQL Server не может обрабатывать каскадное удаление, даже если два внешних ключа указывают на одну и ту же таблицу? Я не могу придумать ни одной причины, по которой это может потерпеть неудачу.
Это должен быть простой трехэтапный процесс (псевдокод):
- Удалить все матчи испытаний, где ChallengerClubMemberId == 13
- Удалить все матчи с вызовом, где ChallengeeClubMemberId == 13
- Удалить члена клуба, где Id = 13.
Почему SQL Server не может этого сделать или почему он этого не делает?