配置OnDelete(DeleteBehavior.ClientCascade)后删除主实体未级联删关联实体是什么原因?
你遇到的问题本质是关系配置的主从方与级联删除的触发逻辑不匹配,数据库级、EF Core级的级联删除默认都是「删除主实体时,自动删除关联的依赖实体」,而你当前的配置中:
- Game_info表持有外键
CodeKodId指向Kod表的主键,所以Kod是关系的主实体,Game_info是依赖实体 - 你删除的是依赖实体Game_info,自然不会触发主实体Kod的删除,和你是否用Include加载关联属性、是否配置ClientCascade无关。
方案1:手动删除关联Kod实体(无需修改模型配置,最稳妥)
直接在删除Game_info的同时,手动将加载好的Code实体加入删除队列即可:
var game = _context.Game_Info.Include(m=> m.Code).First(m => m.SessionID == SessionID); // 手动删除关联的Kod实体 _context.Remove(game.Code); _context.Game_info.Remove(game); _context.SaveChanges();
方案2:将Kod配置为Game_info的从属实体(适合Kod仅属于Game_info的场景)
如果你的业务中Kod不会被其他实体关联,完全是Game_info的附属属性,可以用EF Core的Owned Entity特性,EF会自动处理从属实体的增删改:
modelBuilder.Entity<Game_info>() .OwnsOne(g => g.Code, kodBuilder => { // 可以在这里配置Kod各属性的字段规则,比如长度、是否必填等 kodBuilder.Property(p => p.FirstColor).IsRequired(); kodBuilder.Property(p => p.SecondColor).IsRequired(); kodBuilder.Property(p => p.ThirdColor).IsRequired(); kodBuilder.Property(p => p.FourthColor).IsRequired(); });
配置后你无需再手动处理Kod的删除,删除Game_info时EF会自动删除对应的Kod记录。
方案3:调整外键方向,实现数据库级级联删除
如果你需要Kod是独立实体,但要求删除Game_info时自动删除Kod,可以调整外键到Kod侧,让Kod成为关系的依赖方:
- 先修改Kod类,添加外键和反向导航属性:
public class Kod { public long KodId { get; set; } public string FirstColor { get; set; } public string SecondColor { get; set; } public string ThirdColor { get; set; } public string FourthColor{ get; set;} // 新增外键和反向导航 public long GameInfoId { get; set; } public Game_info GameInfo { get; set; } }
- 修改关系配置:
modelBuilder.Entity<Game_info>() .HasOne(g => g.Code) .WithOne(k => k.GameInfo) // 指定外键存放在Kod表的GameInfoId字段 .HasForeignKey<Kod>(k => k.GameInfoId) // 配置数据库级级联删除,不需要提前Include也能触发 .OnDelete(DeleteBehavior.Cascade);
配置后删除Game_info时,数据库会自动删除关联的Kod记录,不需要提前Include加载Code属性。
内容的提问来源于stack exchange,提问作者Vipp90
相关产品推荐
相关产品推荐

