EF7 RC1:禁用级联删除

时间:2015-11-19 15:23:21

标签: entity-framework-core

在昨天发布的EntityFramework 7的RC1中,添加了Cascade Delete。

要根据关系禁用它,我可以使用:

      builder.Entity<Site>().HasOne(e => e.Person)
      .WithMany(x => x.Sites).Metadata.DeleteBehavior = DeleteBehavior.Restrict;

我想为DbContext全局禁用它,但我找不到方法。我该怎么办?

3 个答案:

答案 0 :(得分:25)

有人在github项目论坛上说过,现在唯一的方法是遍历方法OnModelCreating(ModelBuilder builder)中的所有关系,并将DeleteBehavior属性设置为DeleteBehavior.Restrict

        foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
        {
            relationship.DeleteBehavior = DeleteBehavior.Restrict;
        }

答案 1 :(得分:11)

目前的约定不可配置。当前的CascadeDelete约定仅适用于required relationships。 efproject.net上的Relationships Conventions: Cascade Delete(官方EF7文档)如果您了解后果,可以明确禁用所需的关系。

        modelBuilder.Entity<Site>()
            .HasOne(p => p.Person)
            .WithMany(b => b.Sites)
            .IsRequired(false);

否则(和推荐),您需要明确设置On Delete行为(如您所发现的那样)。

        modelBuilder.Entity<Site>()
            .HasOne(p => p.Person)
            .WithMany(b => b.Sites)
            .OnDelete(DeleteBehavior.Restrict);

答案 2 :(得分:0)

如果您对模型类中的属性不使用Required,则默认情况下会将其生成为DeleteBehavior.Restrict。如果您要使用Required,请使用DeleteBehavior.Cascade。您可以通过使用with / without Required来生成虚拟迁移。