2011-04-06 13 views
24

Al usar anotaciones de datos con EF4.1 RC, ¿hay alguna anotación que provoque la eliminación en cascada?¿Puedo utilizar anotaciones de datos para realizar una eliminación en cascada con Entity Framework 4.1 RC?

public class Category 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Category Category { get; set; } 
} 

uso de este modelo la restricción generado es:

ALTER TABLE [Product] ADD CONSTRAINT [Product_Category] 
FOREIGN KEY ([Category_Id]) REFERENCES [Categorys]([Id]) 
ON DELETE NO ACTION ON UPDATE NO ACTION; 

Si no ¿cómo se logra?

Respuesta

39

Poniendo requerido en el campo de relación Categoría de mesa Producto resuelve este

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [Required] //<======= Forces Cascade delete 
    public Category Category { get; set; } 
} 
+0

Muy creativo. Gracias. –

+0

¿Qué se elimina al eliminar qué? – Shimmy

26

me gusta para apagar eliminación en cascada por defecto (eliminando el OneToManyCascadeDeleteConvention)

Estaba esperando agregarlos de nuevo a través de anotaciones, pero me sorprendió que EF no incluya un CascadeDeleteAttribute.

Después de pasar demasiado tiempo trabajando alrededor de los niveles de descriptor de acceso internos ridículos de EF, el código de este quid añade una convención que permite a los atributos que se utilizarán: https://gist.github.com/tystol/20b07bd4e0043d43faff

Para utilizar, sólo se adhieren al [CascadeDelete] en cada extremo de la navegación propiedades para la relación, y agregue la convención en la devolución de llamada OnModeCreating de su DbContext. por ejemplo:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 
    modelBuilder.Conventions.Add<CascadeDeleteAttributeConvention>(); 
} 

Y en su modelo:

public class BlogPost 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    [CascadeDelete] 
    public List<BlogPostComment> Comments { get; set; } 
} 
+3

Esto es mejor que la respuesta elegida porque el atributo Requiered implica una clave externa no anulable. Y funciona con EF 6. ¡Gracias! – rafael

+0

esto - es - impresionante. – jmichas

+1

Gran solución, también, tenga en cuenta que la clase Convention se debe agregar a 'modelBuilder.Conventions' en el método' OnModelCreating'. – Alireza

0

Como ejemplo adicional para Tyson's answer, yo uso el atributo [CascadeDelete] como sigue en una entidad, que se suma con éxito la "cascada" regla de eliminación de la Parent - Child relación.

public class Child 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    [SkipTracking] 
    public Guid Id { get; set; } 

    [CascadeDelete] 
    public virtual Parent Parent { get; set; } 

    [Required] 
    [ForeignKey("Parent")] 
    public Guid ParentId { get; set; } 
} 
Cuestiones relacionadas