首页 > 解决方案 > EFCore OnDelete 级联多对一

问题描述

我有一个数据模型,大致如下:

public class Entity1
{
    public Guid Id { get; set; }
}

public class Entity2
{
    public Guid Id { get; set; }

    public Entity1 RelatedEntity { get; set; }
}

Entity2s在我的情况下,每个都可以有很多,但据我所知,在我的数据模式中跟踪所有使用它的Entity1人并没有任何意义。也许我误解了应该如何构建数据模型。Entity1Entity2s

似乎(来自 Microsoft 教程)为了进行设置,.OnDelete(DeleteBehavior.Cascade);您需要在实体之间建立双向链接。有谁知道是否有可能做到这一点,如果Entity1被删除,它也会包含所有Entity2实例?我是否必须更改我的数据模型以Entity1存储列表Entity2's

谢谢!

标签: .net-coreentity-framework-core

解决方案


不需要任何导航属性。

配置关系所需的只是一对正确Has{One|Many}+ With{One|Many}。正确我的意思是以下 - 如果对应关系端有导航,它必须作为参数传递,否则不应传递 lambda 表达式/属性名称)。

即在你的情况下,你可以使用

modelBuilder.Entity<Entity2>()
    .HasOne(e2 => e2.RelatedEntity)
    .WithMany() // no navigation property

或者

modelBuilder.Entity<Entity1>()
    .WithMany<Entity2>() // no navigation property
    .HasOne(e2 => e2.RelatedEntity)

这些是等效的,使用一个或另一个,两者都不使用(以避免冲突的配置/差异 - 毕竟,关系只是一个,即使有两端)。

一旦你这样做了,你就可以访问关系 API 来配置 FK、级联删除等,例如

.OnDelete(DeleteBehavior.Cascade)

您还可以使 FK 成为必需(默认情况下将打开级联删除):

.IsRequired()

有关详细信息,请参阅 EF Core 文档的“关系”部分,尤其是Manual configuration Single navigation property


推荐阅读