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?
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
modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);