Entity Framework (EF) Code Première suppression en cascade pour une relation un-à-zéro ou un

Suite à la section “Code First Modeling” du cours Pluralsight “Bien démarrer avec Entity Framework 5” de Julie Lerman , j’ai créé deux classes POCO avec une relation un-à-zéro ou un : un parent (User) et un optionnel enfant (UserDetail).

Diagramme de modèle de données utilisateur et UserDetail (cliquez pour afficher).

Notez dans le diagramme que la propriété UserId est une clé primaire et une clé étrangère pour UserDetail .

Code pertinent:

public class User { //... [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } /* Has a 1:0..1 relationship with UserDetail */ public virtual UserDetail UserDetail { get; set; } //... } public class UserDetail { //... /* Has a 0..1:1 relationship with User */ public virtual User User { get; set; } [Key, ForeignKey("User")] public int UserId { get; set; } //... } public class EFDbContext : DbContext { public DbSet Users { get; set; } //public DbSet UserDetails { get; set; } /* Explicit declaration not necessary. Context is aware of UserDetail entity due to 0..1:1 relationship with User */ public EFDbContext() { Configuration.ProxyCreationEnabled = true; Configuration.LazyLoadingEnabled = true; } } public class UserRepository : IUserRepository { private EFDbContext _context = new EFDbContext(); public void Delete(User entity) { entity = _context.Users.Find(entity.UserId); //... _context.Users.Remove(entity); _context.SaveChanges(); //... } } 

Lorsque la méthode Delete () de la classe UserRepository est appelée, elle ne supprime pas l’enregistrement User dans la firebase database car la suppression en cascade n’est pas activée pour la clé étrangère dans UserDetail.

L’instruction DELETE était en conflit avec la contrainte REFERENCE “FK_dbo.UserDetail_dbo.User_UserId”.

Comment pouvez-vous activer les suppressions en cascade pour les relations un-à-zéro ou un à l’ aide du code Entity Framework First (de sorte que la suppression d’un utilisateur supprime automatiquement UserDetail)?

Pour cela, vous devrez utiliser l’API couramment utilisée.

Essayez d’append ce qui suit à votre DbContext :

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasOptional(a => a.UserDetail) .WithOptionalDependent() .WillCascadeOnDelete(true); } 

Ce code a fonctionné pour moi

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(d => d.User) .WithOptional(u => u.UserDetail) .WillCascadeOnDelete(true); } 

Le code de migration était:

 public override void Up() { AddForeignKey("UserDetail", "UserId", "User", "UserId", cascadeDelete: true); } 

Et ça a bien marché. Quand j’ai utilisé pour la première fois

 modelBuilder.Entity() .HasOptional(a => a.UserDetail) .WithOptionalDependent() .WillCascadeOnDelete(true); 

Le code de migration était:

 AddForeignKey("User", "UserDetail_UserId", "UserDetail", "UserId", cascadeDelete: true); 

mais il ne correspond à aucune des deux surcharges disponibles (dans EntityFramework 6)

Vous pouvez également désactiver la convention de suppression en cascade dans la scope globale de votre application en procédant comme suit:

 modelBuilder.Conventions.Remove() modelBuilder.Conventions.Remove()