2 votes

Comment puis-je spécifier null aux clés étrangères sur le parent supprimer à la fois dans M-V-C Code première approche ?

J'ai de nombreuses tables qui ont des relations de clé étrangère. Par exemple, la relation entre les pays et les villes. Lorsque je supprime un pays, mon application s'arrête parce que j'ai une relation de clé étrangère. Ce que je veux, c'est que si l'utilisateur supprime le pays, il soit supprimé et que les clés étrangères deviennent nulles. Voici mon code dans la méthode OnModelCreating :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Player>().HasOptional(r => r.Team)
        .WithMany(a => a.Players)
        .HasForeignKey(b => new { b.TeamId })
        .WillCascadeOnDelete(false);

    base.OnModelCreating(modelBuilder);
}

Le problème est que j'ai 20 à 25 tables et que je ne veux pas le faire manuellement. Existe-t-il un code permettant de mettre automatiquement la cascade en échec pour l'ensemble de l'application ?

1voto

Steve Greene Points 8668

Oui, vous pouvez supprimer la suppression en cascade pour les conventions One-to-many et/ou Many-to-many dans Code First. Il suffit d'ajouter l'une ou l'autre de ces conventions à votre OnModelCreating :

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

Ceci le désactivera, mais vous pouvez réactiver la suppression en cascade avec .WillCascadeOnDelete(true) au besoin. Voir aquí y aquí .

EDIT : Si votre question concerne la mise à zéro de FK pour une collection, vous pouvez faire ceci :

  1. Assurez-vous que vous avez une collection de villes sur le pays.
  2. Exposez CountryId comme un FK sur votre modèle de ville et rendez-le nullable.
  3. Mettez-les à zéro et supprimez le pays.
var countryToDelete =  context.Country.Include(c => c.Cities).FirstOrDefault(c => c.CountryId == countryIdToDelete;
countryToDelete.Cities.ForEach(c => c.CountryId = null);
context.Country.Remove(countryToDelete);
context.SaveChanges();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X