update framework foreign first false disable delete code attribute entity-framework ef-code-first entity-framework-4.1 cascading-deletes

entity-framework - first - entity framework foreign key attribute cascade delete



¿Cómo se asegura de que Cascade Delete esté habilitado en una relación de tabla en el Código EF primero? (2)

La posible razón por la que no obtiene la eliminación en cascada es que su relación es opcional. Ejemplo:

public class Category { public int CategoryId { get; set; } } public class Product { public int ProductId { get; set; } public Category Category { get; set; } }

En este modelo, obtendría una tabla de Producto que tiene una clave externa a la tabla de Categoría, pero esta clave es anulable y no hay una configuración de eliminación en cascada en la base de datos de forma predeterminada.

Si desea tener la relación requerida, tiene dos opciones:

Anotaciones:

public class Product { public int ProductId { get; set; } [Required] public Category Category { get; set; } }

API fluida:

modelBuilder.Entity<Product>() .HasRequired(p => p.Category) .WithMany();

En ambos casos, la eliminación en cascada se configurará automáticamente.

Si desea tener la relación opcional pero CON la eliminación en cascada necesita configurar esto explícitamente:

modelBuilder.Entity<Product>() .HasOptional(p => p.Category) .WithMany() .WillCascadeOnDelete(true);

Edición: en el último fragmento de código también puede simplemente escribir .WillCascadeOnDelete() . El valor predeterminado de esta sobrecarga sin parámetros es true para configurar la eliminación en cascada.

Ver más sobre esto en la documentation

Me gustaría habilitar CASCADE DELETE en una tabla usando el código primero. Cuando el modelo se vuelve a crear desde cero, no hay un ajuste CASCADE DELETE aunque las relaciones se configuren automáticamente. Lo extraño es que SÍ habilita esto para algunas tablas con una relación de muchos a muchos, sin embargo, usted pensaría que podría tener problemas.

Configuración: Tabla A <- Tabla B.

FK de la tabla B apunta a la tabla A de PK.

¿Por qué esto no funcionaría?


modelBuilder .Entity<Product>() .HasRequired(p => p.Category) .WithMany(x => x.Products) .WillCascadeOnDelete(true);