2012-03-12 6 views
1

Возможно ли получить каскадное удаление на этой объектной модели?Entity Framework 4.3 и каскад delete

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

Эта модель будет генерировать базу данных, которая будет каскадно удалять домашних животных, когда Владелец удаляется. Но он не будет каскадом delete Comment, он просто удалит 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 же строк должны быть связаны как с Owner и Pet. Если вы удалите Owner, он вызовет каскадное удаление до Comment, а домашнее животное и Pet вызовет каскадное удаление до Comment, а также => несколько каскадных путей, которые не поддерживаются на SQL-сервере.

Обычно это обрабатывается путем ручного удаления или отдельным триггером базы данных, обрабатывающим удаление связанных записей.

+0

Как я и предполагал :-) –

Смежные вопросы