[英]How can I delete in cascade?
我用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時,我有以下錯誤消息:
表“elt”上的更新或刪除違反表“history_elt”上的外鍵約束“previous_elt_id_fkey”
我該如何解決我的問題?
您似乎正在嘗試刪除具有主鍵的行,該行由來自另一行/表的外鍵引用
主鍵位於“elt”中,外鍵是“history_elt”上的“previous_elt_id_fkey”
因此,當列允許NULL值時,您需要從引用此主鍵的其他行/表中刪除值。 或者您也刪除了引用行。
或者您更改列以允許空值。
或者我的另一個想法,因為我喜歡處理它:
添加到“elt”列BIT(布爾值)類型並添加到您的查詢中,它不應處理將此列設置為true的行。 給出的例子:
SELECT * FROM eft WHERE bitColumn = 'false'
然后你不需要刪除該行,只需將BIT列標記為true即可
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.