在EntityFramework中删除具有相关实体的实体

时间:2013-04-05 21:14:11

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

我有以下代码:

[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.

我知道这意味着什么,但我不知道如何使代码工作。我需要首先删除与Transacciones相关的所有EventosUsuario,以便能够删除Usuario

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:1)

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

如果在删除'级联时,执行您在上面执行的foreach / remove组合是不必要的。在数据库上设置。有几种方法可以做到这一点,但本章的编程实体框架:代码优先' https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449317867/ch04s04.html解释得非常好。

在上面的情况中:

usuario.Transacciones

usuario.Eventos

进入该协会的课程,并在反向键(可能在这种情况下,公共虚拟Usuarios;,在协会'类中)添加装饰器[必需],这将改变外国密钥使其在删除时级联。

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