2012-02-11 2 views
11

Я довольно новичок в MVC, и у меня проблемы с каскадным удалением. Для моей модели I следующие 2 класса:MVC. Net Каскад Удаление при использовании EF Code Первый подход

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

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

ответ

15

Это потому, что 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); 
+0

Yay! : D, спасибо, что это сработало !, большое спасибо, я просто не знал о свободном API, но, похоже, хороший способ сделать это, кстати, могу ли я получить это поведение с аннотациями данных ?. –

+0

@Q_ro Аннотации данных имеют ограниченный набор функций. – Eranga

1

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

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

Ну, думать об этом таким образом, каждый продукт, есть категорию, я хочу удалить эти категории, когда я удаляю продукт, потому что, как и сейчас, если я удалю продукт, мои категории все равно будут находиться в базе данных. –

+0

Да, но ваш код должен показывать только код, содержащий категории, также должен быть столбец с включенным/отключенным для категорий и элементов, по сути, вы ничего не должны удалять, но просто отмечаете как удаленные, это уменьшает проблемы позже, когда ссылается идентификатор, но более не существует. если вы хотите, хотя вы можете получить идентификатор категории из объекта, удалите категорию, а затем удалите исходный объект, но вы действительно должны писать код, чтобы лучше справляться с ним, а не просто удалять все :-) – davethecoder

+0

спасибо за совет, i Я буду помнить это :). –