MVC.NET Cascade Удаление при использовании первого подхода EF Code

Я новичок в 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");
}

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

Ответ 1

Это потому, что по умолчанию 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);

Ответ 2

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

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