EF Core TPH模式下Order关联User子类外键报级联路径错误如何解决
错误根因
这个报错是SQL Server的原生限制:不允许存在多条级联删除路径指向同一张表。你当前Order表的tailor_id和customer_id两个外键都关联到User表,EF Core默认会给所有外键开启ON DELETE CASCADE(级联删除),删除用户时会同时触发两条级联路径删除关联的Order,因此触发约束报错。
解决方案
无需修改现有实体结构(不需要往User基类加任何导航属性),只需要修改OnModelCreating中Order的外键配置,给至少一个外键关闭级联删除即可:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>() .HasDiscriminator(x => x.UserType) .HasValue<ShopTailor>(UserRoleConstants.TAILOR) .HasValue<Customer>(UserRoleConstants.CUSTOMER); modelBuilder.Entity<Order>() .HasOne(o => o.Tailor) .WithMany(t => t.Orders) .HasForeignKey(ot => ot.TailorId) // 关闭级联删除 .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity<Order>() .HasOne(o => o.Customer) .WithMany(c => c.Orders) .HasForeignKey(ct => ct.CustomerId) // 也可以根据业务需求只关闭其中一个 .OnDelete(DeleteBehavior.Restrict); }
级联行为说明
你可以根据业务需求选择合适的删除行为:
DeleteBehavior.Restrict/DeleteBehavior.NoAction:如果用户还关联了Order,会直接阻止删除用户,需要先手动删除关联的Order再操作用户删除,安全性最高- 如果需要保留“删除用户时自动删除关联订单”的逻辑,可以只关闭其中一个外键的级联删除,只要不同时开启两个即可避免报错。
内容的提问来源于stack exchange,提问作者Junaid bin Abdul Razzaq
相关产品推荐
相关产品推荐

