Удаление каскада MVC .Net при использовании первого кода EF - PullRequest
11 голосов
/ 11 февраля 2012

Я довольно новичок в MVC, и у меня проблемы с каскадным удалением. Для моей модели я следующие 2 класса:

    public class Blog
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [DisplayFormat()]
        public virtual ICollection<BlogEntry> BlogEntries { get; set; }
        public DateTime CreationDateTime { get; set; }
        public string UserName { get; set; }
    }

    public class BlogEntry
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Title { get; set; }
        [Required]
        public string Summary { get; set; }
        [Required]
        public string Body { get; set; }
        public List<Comment> Comments { get; set; }
        public List<Tag> Tags { get; set; }
        public DateTime CreationDateTime { get; set; }
        public DateTime UpdateDateTime { get; set; }
        public virtual Blog ParentBlog { get; set; }

    }

И для моего контроллера я установил следующее при удалении поста назад:

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
    Blag blog = db.Blogs.Find(id);

    foreach (var blogentry in blog.BlogEntries)
    {
        //blogentry = db.BlogEntries.Find(id);
        db.BlogEntries.Remove(blogentry);
    }
    db.Blogs.Remove(blog);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Проблема в том, что это не будет работать, несмотря ни на что; Я прочитал этот пост , но мне кажется, что я работаю только с моделями, в которых отношение один к одному, поэтому я здесь потерян, у меня везде поиск, и я не могу найти решение этой проблемы, если некоторые могут указать на то, что мне не хватает, это было бы очень приятно :), спасибо заранее, и снова, извините за свою нерешительность, я только начинаю, но хотел заняться большим проектом, чтобы иметь возможность многому научиться.

Ответы [ 2 ]

16 голосов
/ 11 февраля 2012

Это потому, что EF по умолчанию не предписывает каскадное удаление для необязательных отношений. Отношения в вашей модели выводятся как необязательные.

Вы можете добавить ненулевое скалярное свойство (BlogId) для FK

public class BlogEntry
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public string Summary { get; set; }
    [Required]
    public string Body { get; set; }
    public List<Comment> Comments { get; set; }
    public List<Tag> Tags { get; set; }
    public DateTime CreationDateTime { get; set; }
    public DateTime UpdateDateTime { get; set; }

    public int ParentBlogId { get; set; }

    public virtual Blog ParentBlog { get; set; }
}

Или настройте это, используя свободный API

   modelBuilder.Entity<BlogEntry>()
            .HasRequired(b => b.ParentBlog)
            .WithMany(b => b.BlogEntries)
            .WillCascadeOnDelete(true);
1 голос
/ 11 февраля 2012

Не уверен, что вы пытаетесь сделать здесь, но у вас есть одна запись, поэтому не уверен, почему вы пытаетесь зациклить. Вот мой код удаления:

public ActionResult Delete(int id)
{
    try {
        Products products = context.Products.Single(x => x.productId == id);
        return View(products);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("", ex.Message);
        CompileAndSendError(ex);
        return View(new Products());
    }
}

//
// POST: /Products/Delete/5

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
    try {
        Products products = context.Products.Single(x => x.productId == id);
        context.Products.Remove(products);
        context.SaveChanges();
        return RedirectToAction("Index");
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("",ex.Message);
        CompileAndSendError(ex);
        return RedirectToAction("Index");
    }
}
...