2012-03-12 177 views
1

是否有可能得到级联对这个对象模型删除?实体框架4.3和级联删除

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); 
} 

这种模式将产生将级联删除宠物当业主被删除的数据库。但它不会级联删除评论,它只会从注释表中删除FK。如果我尝试相应地修改约束。

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 

出现以下sql错误。

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

这使我得出的结论是,创建的模型不支持级联删除,我被迫单独删除评论。或者我在这里错过了什么?

回答

2

是模型不支持直接级联在SQL服务器中删除,因为即使你不想想你的数据库表示支持同Comment行与两OwnerPet有关。如果你再删除Owner会触发级联删除对Comment和宠物和Pet将触发级联删除对未在SQL服务器支持Comment以及=>多阶路径。

这通常是由手动删除或由单独的数据库触发器处理的相关记录的删除处理。

+0

正如我怀疑:-) – 2012-03-12 11:08:51