5

ottengo questo errore:EF - Cascade Delete non funziona, Impossibile eliminare oggetto

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.

ho questa struttura:

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; } 
    } 

il mio metodo di eliminazione:

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(); 
    } 

my DbContext:

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

risposta

20

Sembra che il post che si sta tentando di eliminare abbia commenti secondari.

Entity Framework non si assume alcuna responsabilità per l'eliminazione a cascata di un'eliminazione nel database - si prevede che si otterrà ciò impostando un'eliminazione a cascata sulla relazione di chiave esterna nell'RDBMS.

Detto questo, se si elimina un'entità padre in Entity Framework, tenterà di emettere istruzioni di eliminazione per tutte le entità figlio che sono state caricate nell'attuale DbContext, ma non inizializzerà alcuna entità figlio che non ha ancora stato caricato Ciò può comportare l'RDBMS che lancia eccezioni di violazione del vincolo di chiave esterna se non è stata specificata un'eliminazione a cascata, come quella che si sta visualizzando. Per ulteriori dettagli sul modo in cui l'eliminazione a cascata "funziona" in Entity Framework, see this blog post.

Problemi correlati