web-dev-qa-db-fra.com

Comment vous assurez-vous que la suppression en cascade est activée en premier sur une relation de table dans EF Code?

Je voudrais activer CASCADE DELETE sur une table en utilisant le code en premier. Lorsque le modèle est recréé à partir de zéro, il n'y a pas de jeu CASCADE DELETE, même si les relations sont automatiquement configurées. La chose étrange est qu’elle active ceci pour certaines tables avec une relation plusieurs à plusieurs, avec lesquelles on pourrait penser qu’elle pourrait avoir des problèmes.

Configuration: Tableau A <- Tableau B.

Le FK de la table B pointe vers le PK de la table A.

Pourquoi cela ne marcherait-il pas?

26
jaffa

La raison possible pour laquelle vous ne recevez pas de suppression en cascade est que votre relation est facultative. Exemple:

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

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

Dans ce modèle, vous obtiendrez une table Product qui contient une clé étrangère dans la table Category mais cette clé est nullable et il n'y a pas de configuration de suppression en cascade dans la base de données par défaut.

Si vous voulez avoir la relation requise, vous avez deux options:

Annotations:

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

API Fluent:

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

Dans les deux cas, la suppression en cascade sera configurée automatiquement.

Si vous voulez avoir la relation facultative mais avec une suppression en cascade, vous devez configurer ceci explicitement:

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

Edit: Dans le dernier extrait de code, vous pouvez également écrire simplement .WillCascadeOnDelete(). La valeur par défaut de cette surcharge sans paramètre est true pour la configuration de la suppression en cascade.

Plus d'informations à ce sujet dans la documentation

54
Slauma
modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);
0
Peter Barbanyaga