我用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”
如何解决我的问题?
答案 0 :(得分:0)
您似乎正在尝试删除具有主键的行,该行被另一个行/表中的外键引用了
表“ history_elt”上的主键在“ elt”中,外键在“ previous_elt_id_fkey”
因此,当列允许使用NULL值时,您需要从另一个引用此主键的行/表中删除值。 或者您也删除引用行。
或者您将列更改为允许空值。
还是我的另一个想法,因为我喜欢这样处理:
将列BIT(布尔)类型添加到“ elt”并添加到您的查询中,即它不应处理将此列设置为true的行。 给出示例:
SELECT * FROM eft WHERE bitColumn = 'false'
然后您无需删除该行,只需将BIT列标记为true