Хобрук: Ваш путь к мастерству в программировании

Почему SQL Server не может обрабатывать каскадные удаления для двух внешних ключей, указывающих на одну и ту же таблицу?

Я использую 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 не может обрабатывать каскадное удаление, даже если два внешних ключа указывают на одну и ту же таблицу? Я не могу придумать ни одной причины, по которой это может потерпеть неудачу.

Это должен быть простой трехэтапный процесс (псевдокод):

  1. Удалить все матчи испытаний, где ChallengerClubMemberId == 13
  2. Удалить все матчи с вызовом, где ChallengeeClubMemberId == 13
  3. Удалить члена клуба, где Id = 13.

Почему SQL Server не может этого сделать или почему он этого не делает?


  • глупый вопрос, но вы убедились, что настройки ограничения применяются в БД? Например, для правила обновления вставки установлено значение «Удалить правила: Каскад»? Потому что по умолчанию на самом деле «без действий» 11.05.2011

Ответы:


1

Проблема в том, что ваша конфигурация допускает несколько путей каскадного удаления. Это может произойти, если оба ваших свойства будут указывать на один и тот же ClubMember. SQL Server не позволяет этого. Это больше касается внутренней реализации SQL-сервера, и более подробную информацию можно найти в этот ответ. Я думаю, что эта проверка является простым и безопасным решением, чтобы избежать некоторых условий гонки во время параллельного каскадного удаления.

11.05.2011
Новые материалы

#093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..

numberToString.js (8kyu 16)
Алгоритм кодовых войн Проблема Нам нужна функция, которая может преобразовать число в строку. 숫자를 문자열로 변환하는 함수를 작성해라. Решение 01 function numberToString(n) { return n.toString(); }..

Лучшие практики для быстрого изучения языка программирования
Изучение языка программирования может быть сложной задачей, но при правильном подходе определенно возможно быстро выучить язык программирования. Хорошее понимание языка программирования может..

Использование данных из Adobe Analytics в предложениях Adobe Target
Я уверен, что все видели эти всплывающие окна в интернет-магазинах, которые говорят что-то вроде « 15 человек просматривают этот товар прямо сейчас! » или « 105 человек из Мичигана купили это..

Машинное обучение и его набор данных в CreateML
Когда я впервые начал учиться в Apple Developer Academy, у меня был момент неуверенности в моем интересе к машинному обучению. Нужно ли мне сменить карьеру моей мечты с специалиста по данным на..

Обучение требует воли
Недавно я прочитал отличную статью Шейна Легга и Джоэла Венесса из DeepMind. http://arxiv.org/pdf/1109.5951v2.pdf В статье «универсальный интеллект» агента π определяется как: Поэтому..

Безопасность по дизайну делает всех счастливыми
Заложенная безопасность делает всех счастливыми Если вы никогда не смотрели Louis C.K. рассказать о том, как Все удивительно, и никто не счастлив ; побаловать себя. Сделайте это прямо..