我有以下代码:
[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
循环,并在删除之前附加每个Transaccion
和Evento
个实体,但它也不起作用。
这是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
相关的所有Eventos
和Usuario
,以便能够删除Usuario
。
答案 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而不是被删除。