2012-03-12 125 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