如何使用EF核心在SQL Server的同一表内创建父子关系

ulydmbyx  于 2022-11-21  发布在  SQL Server
关注(0)|答案(1)|浏览(177)

这是我的模型Schedule.cs

public int Id { get; set; }
        public int? ParentScheduleId { get; set; }
        public Schedule? ParentSchedule { get; set; }
        public ICollection<Schedule>? ChildSchedules { get; set; }

以下是配置代码:

public class ScheduleConfiguration : IEntityTypeConfiguration<Schedule>
    {
        public void Configure(EntityTypeBuilder<Schedule> builder)
        {
            builder.Property(s => s.Id).UseIdentityColumn();

            builder.HasOne(x => x.ParentSchedule)
                .WithMany(x => x.ChildSchedules)
                .HasForeignKey(x => x.ParentScheduleId)
                .OnDelete(DeleteBehavior.Cascade);
        }
    }

这已经在SQLite和MySql数据库上工作了。这是对SQL Server数据库的限制吗?还是我做错了什么?
尝试更新数据库时出现以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Introducing FOREIGN KEY constraint 'FK_Schedules_Schedules_ParentScheduleId' on table 'Schedules' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我已经尝试了错误消息中建议的不同ON DELETE行为。但结果是相同的。

weylhg0b

weylhg0b1#

据我所知,如果更改级联到它所源自的同一个表,或者通常在关系中存在循环时,MS SQL Server不支持删除/更新级联。
因此,这里的解决方案是:

  • 使用ClientCascade行为,它将允许EF对加载的实体执行级联删除,即使数据库不支持此操作。
builder.HasOne(x => x.ParentSchedule)
                .WithMany(x => x.ChildSchedules)
                .HasForeignKey(x => x.ParentScheduleId)
                .OnDelete(DeleteBehavior.ClientCascade);
  • 或者,仅使用默认删除行为ClientSetNul(因为FK可为空):
builder.HasOne(x => x.ParentSchedule)
                .WithMany(x => x.ChildSchedules)
                .HasForeignKey(x => x.ParentScheduleId);

相关问题