【问题标题】:Why is ON DELETE SET NULL still not implemented in the Entity Framework 6? Is there a snag?为什么实体框架 6 中仍未实现 ON DELETE SET NULL?有障碍吗?
【发布时间】:2014-01-22 19:17:51
【问题描述】:

仍然无法首先使用实体​​框架代码配置具有 ON DELETE SET NULL 规则的关系。作为一种解决方法,您必须将所有相关实体加载到内存中,然后在删除父实体时,EF 将发出 SQL 命令将其外键设置为 Null。

这个,虽然使用类似的东西自己实现它是微不足道的:

protected override void Seed(Context context)
{
    context.Database.ExecuteSqlCommand("ALTER TABLE dbo.Guests DROP CONSTRAINT Guest_PreferredLanguage");
    context.Database.ExecuteSqlCommand("ALTER TABLE dbo.Guests ADD CONSTRAINT Guest_PreferredLanguage FOREIGN KEY (LanguageID) REFERENCES dbo.Languages(LanguageID) ON UPDATE NO ACTION ON DELETE SET NULL");
}

(示例取自this post。)

我认为这种方法没有问题:加载的子实体将与数据库保持同步,因为 EF 将更新(设置为 null)它们的外键和引用属性,并且数据库中的其他记录受到影响并没有什么害处因为它们还没有被加载。

那么,为什么这个功能仍然缺失呢?是不是有什么隐藏的陷阱?

【问题讨论】:

标签: entity-framework ef-code-first entity-framework-6


【解决方案1】:

该功能可能没有实现,因为通常更改只会影响实际在工作单元中的对象。级联不可扩展。

而且我还认为在大多数情况下软删除更好。也许这适合你?

您可能还想研究领域驱动设计。这还包括正确使用工作单元(使用聚合)。

顺便说一句,您的解决方案以种子方法编辑数据库。执行迁移的 Up() 方法可能会更好。

【讨论】:

  • *该功能可能未实现,因为通常更改仅影响实际在工作单元中的对象。 * 级联删除也是如此,默认情况下由 EF 配置。软删除是另一个争论的话题;-)
  • 那么他们也应该删除级联删除。至少它们是一致的。
【解决方案2】:

此功能在 Microsoft.EntityFrameworkCore 版本=3.1.10.0 及更高版本中可用。

        modelBuilder.Entity<Guests>()
            .HasOne<Languages>(g => g.Language)
            .WithMany(l => l.Guests)
            .HasForeignKey(g => g.LanguageID)
            .IsRequired(false)
            .OnDelete(DeleteBehavior.SetNull);

注意,DeleteBehavior.SetNull

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多