我已经建立了一个非常简单的 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...
}
所以首先是级联删除。我使用以下配置构建了数据库。我尝试了三种方法:
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);
由此引出三个问题:
可能相关 - 根据 Cascade Delete - EF Core ClientCascade 将抛出 DbUpdateException on Optional relationship with dependents/children not loaded when you delete parent.所以远离它可能很好。