如何级联删除?

时间:2019-06-12 15:12:39

标签: c# postgresql entity-framework .net-core

我用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”

如何解决我的问题?

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试删除具有主键的行,该行被另一个行/表中的外键引用了

表“ history_elt”上的主键在“ elt”中,外键在“ previous_elt_id_fkey”

因此,当列允许使用NULL值时,您需要从另一个引用此主键的行/表中删除值。 或者您也删除引用行。

或者您将列更改为允许空值。

还是我的另一个想法,因为我喜欢这样处理:

将列BIT(布尔)类型添加到“ elt”并添加到您的查询中,即它不应处理将此列设置为true的行。 给出示例:

SELECT * FROM eft WHERE bitColumn = 'false'

然后您无需删除该行,只需将BIT列标记为true