Как я могу удалить в каскаде? - PullRequest
0 голосов
/ 12 июня 2019

Я создаю базу данных с помощью postgresql:

elt {
    id : bigserial,
    elt_name : character varying(40),
}

history_elt {
    id : bigserial,
    previous_elt_id : bigint , // (with on update no action and on delete no action)
    reason : character varying(250)
}

Но я хочу, чтобы в моем приложении был пользователь с супер-администратором, чтобы он мог удалять в каскаде, только если он является супер-администратором.

Это возможно сделать с помощью структуры сущностей, потому что я делаю это

[HttpDelete("[Action]{id}")]
public async Task<ActionResult<Elt>> DeleteCascade(int id)
{
    try
    {
        var elt = await _context.Elts.FirstOrDefaultAsync(t => t.Id == id);
        var historyEltToDelete= _context.HistoryElts.Where(t => t.PreviousEltId == elt .Id);

        _context.Elts.Remove(elt);
        _context.SaveChanges();

        historyEltToDelete.Reason= "Delete of elt"+elt.EltName;



 _context.Entry(historyEltToDelete).CurrentValues.SetValues(historyEltToDelete);
                    _context.SaveChanges();

                return Ok(historyEltToDelete);

    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);

    }

}

Когда я хочу попытаться удалить elt, у меня появляется следующее сообщение об ошибке:

update илиудаление в таблице "elt" нарушает ограничение внешнего ключа "previous_elt_id_fkey" в таблице "history_elt"

Как мне решить мою проблему?

1 Ответ

0 голосов
/ 12 июня 2019

Кажется, что вы пытаетесь удалить строку, имеющую первичный ключ, на который ссылался внешний ключ из другой строки / таблицы

Первичный ключ находится в "elt", а внешний ключв таблице «previous_elt_id_fkey» - «history_elt»

Поэтому вам нужно удалить значение из другой строки / таблицы, которая ссылается на этот первичный ключ, когда столбец допускает значения NULL.Или вы тоже удаляете ссылочную строку.

Или вы изменяете свой столбец, чтобы разрешить нулевые значения.

Или другая идея от меня, потому что мне нравится обрабатывать ее так:

добавьте в "elt" тип столбца BIT (логический) и добавьте к вашему запросу, чтобы он не обрабатывал строки, для которых для этого столбца установлено значение true.Пример:

SELECT * FROM eft WHERE bitColumn = 'false'

Тогда вам не нужно удалять строку, вы просто помечаете столбец BIT как true

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