5

consigo este error:EF - Eliminar en cascada que no trabaja, no se puede eliminar objetos

System.Data.SqlClient.SqlException The DELETE statement conflicted with the REFERENCE constraint "FK_comments_postId__164452B1". The conflict occurred in database "awe", table "dbo.comments", column 'postId'. The statement has been terminated.

tengo esta estructura:

public class Post 
    { 
     public long Id { get; set; } 
     public string Body { get; set; }  

     public long? ParentId { get; set; } 
     public virtual Post Parent { get; set; } 
     public virtual ICollection<Post> Posts { get; set; } 

     public virtual ICollection<Comment> Comments { get; set; } 
    } 

    public class Comment 
    { 
     public long Id { get; set; } 
     public long PostId { get; set; } 
     public virtual Post Post { get; set; } 
     public string Body { get; set; } 
    } 

mi método de eliminación:

public void Delete(long id) 
    { 
     var p = context.Set<Post>().Get(id); 
     if(p == null) throw new MyEx("this post doesn't exist"); 
     if (p.Posts.Count > 0) throw new MyEx("this post has children and it cannot be deleted"); 
     context.Set<Post>().Remove(p); 
     context.SaveChanges(); 
    } 

mi DbContext:

public class Db : DbContext 
{ 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<Comment> Comments { get; set; } 
} 

Respuesta

20

Parece que la publicación que está intentando eliminar tiene comentarios secundarios.

Entity Framework no se responsabilizará de la conexión en cascada de una eliminación en la base de datos; espera que logre esto estableciendo una eliminación en cascada en la relación de clave externa en el SGBDR.

Habiendo dicho esto, si elimina una entidad padre en Entity Framework, intentará emitir sentencias delete para cualquier entidad secundaria que se haya cargado en el DbContext actual, pero no inicializará ninguna entidad secundaria que aún no lo haya hecho estado cargado Esto puede llevar a que el RDBMS genere excepciones de violación de restricción de clave externa si no se ha especificado una eliminación en cascada, como la que está viendo. Para obtener más detalles sobre cómo funciona la eliminación de cascada, "funciona" en Entity Framework, see this blog post.

Cuestiones relacionadas