【问题标题】:EF7 RC1 : Disable Cascade DeleteEF7 RC1:禁用级联删除
【发布时间】:2018-04-01 19:31:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

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

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

    【讨论】:

    • .OnDelete(DeleteBehavior.Restrict) 是否与 EF6 WillCascadeOnDelete(False) 相同?我问是因为我的一些模型上有 DeleteBehavior.Restrict 但是当我在 SQL Server 中生成 DB Schema 时,我看到在 Sql 中模式有:ON DELETE CASCADE --> 表示级联
    【解决方案2】:

    目前约定是不可配置的。当前的 CascadeDelete 约定仅适用于 required relationshipsRelationships Conventions: Cascade Delete on efproject.net(官方 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);
    

    【讨论】:

      【解决方案3】:

      如果您不在模型类的属性上使用Required,则默认生成为DeleteBehavior.Restrict。如果您想使用DeleteBehavior.Cascade,请使用Required。您可以通过使用带/不带必需生成虚拟迁移来看到这一点。

      【讨论】:

        猜你喜欢
        • 2015-03-04
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 2018-03-13
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        • 2011-06-29
        相关资源
        最近更新 更多