2012-02-11 16 views
11

Soy bastante nuevo en MVC y tengo problemas con la eliminación en cascada. Para mi modelo me las siguientes clases 2:MVC .Net Cascade Supresión cuando se usa el primer enfoque del código EF

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

    } 

Y para mi controlador puse lo siguiente en el poste de eliminación hacia atrás:

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

El problema es que no lo puedo trabajar no importa qué; I read this post pero parece que solo trabajo para modelos donde la relación es uno a uno, entonces estoy perdido aquí, busco en todas partes, y no puedo encontrar la solución para este problema, si algunos pueden señalar lo que me falta sería realmente agradable :), gracias de antemano, y de nuevo, disculpen mi nooobness, recién estoy comenzando, pero querían abordar un gran proyecto para poder aprender mucho.

Respuesta

15

Eso se debe a que EF por defecto no hace cumplir las eliminaciones en cascada para relaciones opcionales. La relación en su modelo se deduce como opcional.

Puede añadir una propiedad para no anulable escalar (BlogId) del 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; } 
} 

o configurar esto usando API fluida

modelBuilder.Entity<BlogEntry>() 
      .HasRequired(b => b.ParentBlog) 
      .WithMany(b => b.BlogEntries) 
      .WillCascadeOnDelete(true); 
+0

¡Yay! : D, ¡gracias funcionó !, muchas gracias, simplemente no estaba al tanto de la API fluida, pero parece ser una buena forma de hacer esto, por cierto ¿puedo obtener este comportamiento con anotaciones de datos ?. –

+0

@Q_ro Las anotaciones de datos tienen un conjunto limitado de funciones. – Eranga

1

no está seguro de lo que estás tratando de hacer aquí, pero que no tienen un registro tan seguro de por qué su tratando de bucle de aquí es mi código de borrado:

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

Bueno, creo que de esta manera, cada producto, tener una categoría, también quiero eliminar esas categorías cuando elimino un producto, porque, como ahora, si elimino un producto, mis categorías seguirán allí en la base de datos. –

+0

Sí, pero su código solo debe mostrar el código que contiene categorías, también debe tener una columna habilitada/deshabilitada para categorías y artículos, esencialmente no debe eliminar nada, solo marque como borrado esto reduce los problemas más adelante donde se hace referencia a un ID, pero ya no existe. si lo desea, puede obtener la identificación de categoría del objeto, eliminar la categoría y luego eliminar el objeto original, pero en realidad debería escribir código para manejarlo mejor en lugar de simplemente eliminar todo :-) – davethecoder

+0

gracias por el consejo, yo lo tendré en cuenta :) –

Cuestiones relacionadas