2012-03-12 4 views
1

Est-il possible d'obtenir une suppression en cascade sur ce modèle d'objet?Entity Framework 4.3 et suppression en cascade

public class Entity 
{ 
    [Key, Column("Id"), DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
} 

public class Comment : Entity 
{ 
    public string Text { get; set; } 
} 

public class Owner : Entity 
{ 
    public Owner() 
    { 
     Pets = new List<Pet>(); 
     Comments = new List<Comment>(); 
    } 

    public string Name { get; set; } 
    public virtual ICollection<Pet> Pets { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
} 

public class Pet : Entity 
{ 
    public Pet() 
    { 
     Comments = new List<Comment>();  
    } 

    public virtual Owner Owner { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
    public string Name { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Pet>() 
     .HasOptional(d => d.Owner) 
     .WithMany(d => d.Pets) 
     .WillCascadeOnDelete(true); 
} 

Ce modèle va générer une base de données qui en cascade supprimer Animaux lorsqu'un propriétaire est supprimé. Mais il ne supprimera pas le commentaire, il supprimera simplement le FK du tableau des commentaires. Si j'essaie de modifier les contraintes en conséquence.

ALTER TABLE [dbo].[Comments] WITH CHECK ADD CONSTRAINT [FK_Comments_Pets_Pet_Id]  FOREIGN KEY([Pet_Id]) 
REFERENCES [dbo].[Pets] ([Id]) 
ON DELETE CASCADE 
GO 
ALTER TABLE [dbo].[Comments] CHECK CONSTRAINT [FK_Comments_Pets_Pet_Id] 
GO 

ALTER TABLE [dbo].[Comments] WITH CHECK ADD CONSTRAINT [FK_Comments_Owners_Owner_Id]  FOREIGN KEY([Owner_Id]) 
REFERENCES [dbo].[Owners] ([Id]) 
ON DELETE CASCADE 
GO 
ALTER TABLE [dbo].[Comments] CHECK CONSTRAINT [FK_Comments_Owners_Owner_Id] 
GO 

L'erreur sql suivante apparaît.

Introducing FOREIGN KEY constraint 'FK_Comments_Pets_Pet_Id' on table 'Comments' may cause cycles or multiple cascade paths 

Cela me amène à la conclusion que le modèle créé ne peut pas supporter de suppression en cascade et je suis obligé de la suppression des commentaires séparemment. Ou est-ce qu'il me manque quelque chose ici?

Répondre

2

Oui le modèle ne prend pas en charge en cascade directe supprimer dans le serveur SQL parce que même si vous ne pensez pas votre soutien de la représentation de la même base de données Comment ligne à associer à la fois Owner et Pet. Si vous supprimez alors Owner, il déclenchera la suppression en cascade vers Comment et pet et Pet déclenchera la suppression en cascade vers Comment aussi bien => plusieurs chemins en cascade qui ne sont pas pris en charge dans le serveur SQL.

Ceci est généralement géré par une suppression manuelle ou par un déclencheur de base de données séparé gérant la suppression des enregistrements associés.

+0

Comme je me doutais :-) –

Questions connexes