Обновление внешнего ключа при мягком удалении - PullRequest
1 голос
/ 15 апреля 2019

У меня есть 2 строки в моей базе данных. Category и Movie.

Когда я мягко удаляю Movie, я хочу удалить ссылку FK на Category.

У меня есть метод удаления, который выглядит следующим образом:

        public override async Task DeleteAsync(long id, bool permanent = false)
        {
            await DbFactory.ExecAsync(async (db) =>
            {
                if (permanent)
                {

                    await db.DeleteAsync<Movie>(x => x.Id == id);
                }
                else
                {
                    await db.UpdateAsync<Movie>(new { Deleted = true, CategoryId = 0 }, x => x.Id == id);
                }
            });
        }

Но выдается исключение FK, когда я пытаюсь обновить CategoryId

Как я могу это сделать? Я хочу иметь возможность мягко удалить Movie, и только в том случае, если категория не имеет ссылок, можно удалить категорию.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

На вашем месте это были бы шаги

  1. Проверьте, есть ли Any фильмы с таким же идентификатором категории, но с другим идентификатором, чем у удаляемого фильма

  2. Если так, то снимите только фильм

  3. Если нет, то удалите категорию и каскад (если это невозможно, затем сначала удалите фильм, а затем категорию)

Существует также проблема параллелизма. Что делать, если есть два фильма категории, и они удалены одновременно? Это может привести к проблеме, при которой фильмы удаляются в разных потоках, и оба потока проверяют, есть ли какие-либо другие фильмы, и для каждого фильма другой фильм обнаруживается до его удаления. Чтобы справиться с этой ситуацией, я предлагаю создать какую-то очередь удаления фильма, и когда фильм должен быть удален, он попадет в очередь. Этот последовательный способ удаления фильмов решит проблему параллелизма.

0 голосов
/ 15 апреля 2019

Существует ли запись с CategoryId = 0?Вероятно, нет, поэтому вы получаете ошибку.Здесь у вас есть два подхода:

  1. Создать фиктивную «удаленную» категорию с Id = 0 (я лично предпочитаю -1 для этих вещей), обновите ее при мягком удалении

  2. Установите CategoryId на NULL, если поле позволяет NULLs.Это означает, что для этой записи нет никакого отношения к категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...