了解实体框架中的级联删除

问题描述 投票:0回答:0

我已经建立了一个非常简单的 1:many 关系,其中父级可以为 null。该系统的设计是每个事件都有一个父级,县、州或竞选中的任何一个。

一个事件永远不应将所有三个设置为空,也不应将多个事件设置为非空值。

删除县/州/活动时,需要删除它的子事件。

    public class Campaign
    {
        public ICollection<Event> Events { get; set; }
        // lots of other properties...
    }
    
    public class Event
    {
        public County? County { get; set; }
        public State? State { get; set; }
        public Campaign? Campaign { get; set; }
        // lots of other properties...
    }

所以首先是级联删除。我使用以下配置构建了数据库。我尝试了三种方法:

  1. 没有调用 OnDelete()
  2. 调用 OnDelete(DeleteBehavior.ClientCascade)
  3. OnDelete(DeleteBehavior.Cascade)
    public class CampaignConfiguration : IEntityTypeConfiguration<Campaign>
    {
        public void Configure(EntityTypeBuilder<Campaign> builder)
        {
            builder.HasMany(x => x.Events)
                .WithOne(x => x.Campaign).OnDelete(DeleteBehavior.ClientCascade);
        }
    }

迁移文件的唯一区别是 InitialCreate.cs。 InitialCreate.Designer.cs 和 CreateModelSnapshot.cs 在重复 Configure 中设置的内容方面有所不同,但我认为这不是 EF 决定要做的,而只是记录我的代码中编写的内容。

什么都没有 & ClientCascade:

           constraints: table =>
            {
                table.PrimaryKey("PK_Events", x => x.Id);
                table.ForeignKey(
                    name: "FK_Events_Campaigns_CampaignId",
                    column: x => x.CampaignId,
                    principalTable: "Campaigns",
                    principalColumn: "Id");

级联:

            constraints: table =>
            {
                table.PrimaryKey("PK_Events", x => x.Id);
                table.ForeignKey(
                    name: "FK_Events_Campaigns_CampaignId",
                    column: x => x.CampaignId,
                    principalTable: "Campaigns",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);

由此引出三个问题:

  1. 在没有任何情况的情况下,Event.CampaignId 设置为 null。这是可空父级的正确操作,但为什么/如何发生?
  2. 在 ClientCascade 的情况下,即使没有设置 onDelete,事件对象也会被删除 - 为什么/如何发生?
  3. 还有一个基本的困惑,缓解文件与 ClientCascade 完全相同,但行为不同。这种差异从何而来?是 InitialCreate.Designer.cs 还是 CreateModelSnapshot.cs 的区别?那些也被提供给底层数据库吗?

可能相关 - 根据 Cascade Delete - EF Core ClientCascade 将抛出 DbUpdateException on Optional relationship with dependents/children not loaded when you delete parent.所以远离它可能很好。

entity-framework entity-framework-core cascading-deletes
© www.soinside.com 2019 - 2024. All rights reserved.