EF - Каскадное удаление не работает, не удается удалить объект - PullRequest
6 голосов
/ 26 сентября 2011

Я получаю эту ошибку:

System.Data.SqlClient.SqlException Оператор DELETE конфликтует с ограничением REFERENCE "FK_ comments _postId__164452B1".Конфликт произошел в базе данных «awe», таблице «dbo.comments», столбце «postId».Оператор был прерван.

У меня есть такая структура:

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

мой метод удаления:

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

мой DbContext:

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

1 Ответ

25 голосов
/ 26 сентября 2011

Звучит так, как будто у поста, который вы пытаетесь удалить, есть дочерние комментарии.

Entity Framework не берет на себя ответственность за каскадное удаление в базе данных - он ожидает, что вы достигнете этого, установив каскадное удаление в отношении внешнего ключа в СУБД.

Сказав это, если вы удалите родительскую сущность в Entity Framework, она попытается выдать операторы удаления для любых дочерних сущностей, которые были загружены в текущий DbContext, , но не инициализирует никакие дочерние сущности, которые имеют еще не загружен . Это может привести к тому, что СУБД вызовет исключения нарушения ограничения внешнего ключа, если не было указано каскадное удаление, например, то, которое вы видите. Подробнее о том, как «работает» каскадное удаление в Entity Framework, см. В этом блоге .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...