3

我有以下代码:

[HttpPost]
public ActionResult Eliminar(Usuario usuario)
{
        db.Usuarios.Attach(usuario);
        usuario.Transacciones.ToList().ForEach(t => db.Transacciones.Remove(t));
        usuario.Eventos.ToList().ForEach(e => db.Eventos.Remove(e));
        db.Usuarios.Remove(usuario);
        db.SaveChanges();
        return RedirectToAction("Index");
}

我不能让它工作。我知道要删除一个实体,您首先必须附加它,但它不适用于具有关系的实体。我也尝试做一个foreach循环,并在删除它们之前附加每个TransaccionEvento实体,但它也不起作用。

这是InnerException包含的错误:

System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_TR_US". The conflict occurred in database "bd_dm", table "dbo.Transacciones", column 'idUsuario'. The statement has been terminated.

我知道这意味着什么,但我不知道如何使代码工作。我需要先删除所有TransaccionesEventos相关的Usuario,才能删除Usuario.

4

2 回答 2

3

经过大量调试(在远程服务器中),我发现了问题所在。Usuario usuario数据正确地传递给Eliminar方法,但相关对象没有。所以我必须先加载它们,然后才能删除它们,然后删除Usuario对象。

这是我的最终代码:

[HttpPost]
public ActionResult Eliminar(Usuario usuario)
{
    db.Usuarios.Attach(usuario);
    db.Entry(usuario).Collection("Transacciones").Load();
    db.Entry(usuario).Collection("Eventos").Load();

    usuario.Transacciones.ToList().ForEach(t => db.Transacciones.Remove(t));
    usuario.Eventos.ToList().ForEach(e => db.Eventos.Remove(e));
    db.Usuarios.Remove(usuario);
    db.SaveChanges();

    return RedirectToAction("Index");
}
于 2013-04-05T22:39:01.343 回答
1

这可能不会帮助你,但可能会帮助那些看到这个的人(就像我在研究这个问题时所做的那样)。

如果在数据库上设置了“删除时级联”,则不需要执行上述 foreach/remove 组合。有几种方法可以做到这一点,但“编程实体框架:代码优先”中的这一章https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449317867/ch04s04.html很好地解释了它.

在您的上述情况下:

usuario.Transacciones

usuario.Eventos

只需进入该关联的类,并在反向键上(可能在这种情况下,公共虚拟 Usuarios;,在关联的类中)添加装饰器 [Required],它将更改外键,使其在删除时具有级联。

如果您不这样做,这些关联将被设置为 null 而不是被删除。

于 2016-03-22T15:07:03.220 回答