2012-03-12 18 views
1

このオブジェクトモデルでカスケード削除を取得できますか?Entity Framework 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 

これは、作成したモデルは、カスケード削除をサポートすることができないという結論に私をもたらし、私はよseparatlyコメントの削除にに強制しています。それとも、私はここに何かを逃していますか?

答えて

2

あなたのデータベース表現のサポート同じComment行がOwnerPetの両方に関連していることがそれについて考えていない場合でもので、はいモデルは、直接カスケードは、SQLサーバーで、削除をサポートしていません。 Ownerを削除すると、カスケード削除がCommentになり、ペットとPetがカスケード削除をCommentにトリガーしますが、SQLサーバーではサポートされていない複数のカスケードパスがトリガーされます。

これは、通常、手動削除または関連するレコードの個別のデータベーストリガー処理削除によって処理されます。

+0

私が疑ったように:-) –